У меня есть следующий пример XML:
<?xml version = "1.0" encoding = "UTF-8"?>
<root>
<document>
<name>Example</name>
<date>2020-10-31</date>
<level>X_LEGAL_ABC</level>
<bundle>
<b001>E_AT01</b001>
<example_id>00000000000007372165</example_id>
<field>
<field_value>EUR</field_value>
<fieldname>CUR007</fieldname>
</field>
<field>
<field_value>2018-06-30</field_value>
<fieldname>C207</fieldname>
</field>
<field>
<field_value>2014-07-01</field_value>
<fieldname>C206</fieldname>
</field>
</bundle>
<bundle>
<b001>E_AT01</b001>
<example_id>00000000000007372163</example_id>
<field>
<field_value>EUR</field_value>
<fieldname>CUR007</fieldname>
</field>
<field>
<field_value>2020-05-31</field_value>
<fieldname>C207</fieldname>
</field>
<field>
<field_value>2014-06-01</field_value>
<fieldname>C206</fieldname>
</field>
</bundle>
</document>
</root>
Со следующим файлом XSLT:
<?xml version = "1.0" encoding = "UTF-8"?> <xsl:stylesheet version='1.1' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output method = "xml" indent = "yes"/>
<xsl:template match = "/">
<document>
<xsl:attribute name = "name"><xsl:value-of select = "/root/document/name"/></xsl:attribute>
<xsl:attribute name = "date"><xsl:value-of select = "/root/document/date"/></xsl:attribute>
<xsl:attribute name = "level"><xsl:value-of select = "/root/document/level"/></xsl:attribute>
<xsl:for-each select = "/root/document/bundle">
<bundle>
<xsl:attribute name = "Example_id"><xsl:value-of select = "example_id"/></xsl:attribute>
<xsl:attribute name = "B001"><xsl:value-of select = "B001"/></xsl:attribute>
<xsl:for-each select = "./field">
<field>
<xsl:attribute name = "FIELDVALUE"><xsl:value-of select = "field_value"/></xsl:attribute>
<xsl:attribute name = "FIELDNAME"><xsl:value-of select = "fieldname"/></xsl:attribute>
</field>
</xsl:for-each>
</bundle>
</xsl:for-each>
</document>
</xsl:template>
</xsl:stylesheet>
Это дает мне рабочий новый формат XML:
<?xml version = "1.0" encoding = "UTF-8"?>
<document name = "Example" date = "2020-10-31" level = "X_LEGAL_ABC">
<bundle Example_id = "00000000000007372165" B001 = "">
<field FIELDVALUE = "EUR" FIELDNAME = "CUR007"/>
<field FIELDVALUE = "2018-06-30" FIELDNAME = "C207"/>
<field FIELDVALUE = "2014-07-01" FIELDNAME = "C206"/>
</bundle>
<bundle Example_id = "00000000000007372163" B001 = "">
<field FIELDVALUE = "EUR" FIELDNAME = "CUR007"/>
<field FIELDVALUE = "2020-05-31" FIELDNAME = "C207"/>
<field FIELDVALUE = "2014-06-01" FIELDNAME = "C206"/>
</bundle>
</document>
Однако я хотел бы, чтобы поле FIELDVALUE отображалось как FIELD VALUE. Итак, с пустым пространством между ними. Возможно ли это в файле XSLT?
Могу ли я изменить: <xsl: имя атрибута = "ЗНАЧЕНИЕ ПОЛЯ"
Во что-то вроде: <xsl:attribute name="ЗНАЧЕНИЕ ПОЛЯ"
Это возможно? Потому что, если я попытаюсь запустить его, он не сработает.
Я новичок в этой работе XSLT, поэтому буду признателен за любую помощь.
С наилучшими пожеланиями,
Майкл
XSLT предназначен для создания правильно сформированного XML, а правильно сформированный XML не допускает пробелов в именах атрибутов.
Нет, это невозможно*, потому что спецификация XML не допускает пробелов в именах элементов и атрибутов.
(*) Это возможно, если вы создадите вывод в виде текста, но результатом будет неправильный XML-документ.
Чисто из любопытства, у вас есть пример, как это тогда будет работать и как это будет выглядеть?
Это ужасный взлом и пустая трата времени, но вы можете увидеть, как он может «работать», здесь: xsltfiddle.liberty-development.net/nb9PtDu. Конечно, результат будет отклонен любым парсером XML.
Вы можете найти некоторую информацию по этому вопросу здесь: stackoverflow.com/questions/2277297/…. Я бы сказал, что это просто напрашивается на неприятности. Какая польза от наличия этого пробела в имени атрибута?