У меня есть xml-файл:
<response>
<ERROR_CODE>0</ERROR_CODE>
<result>
<value>
<Account>L01+00000F00</Account>
<SecurCode>RU000A1017H9</SecurCode>
<Accruedint>0.0000</Accruedint>
<ComisClear>0.0000</ComisClear>
</value>
<value>
<Account>1231+00000F00</Account>
<SecurCode>RU000A1017H9</SecurCode>
<Accruedint>0.12300</Accruedint>
<ComisClear>0.012300</ComisClear>
</value>
</result>
Я хочу обернуть все значения тегом глубокого значения в тег <![CDATA]]>. Теперь я пытаюсь сделать так:
<xsl:template match = "/">
<response>
<xsl:apply-templates select = "response"/>
</response>
</xsl:template>
<xsl:template match = "response">
<xsl:for-each select = "*">
<xsl:element name = "{local-name()}">
<xsl:value-of select = "substring(*,1,3)"/>
<xsl:value-of select = "current()"/>
</xsl:element>
</xsl:for-each>
<xsl:apply-templates select = "value"/>
</xsl:template>
<xsl:template match = "value">
<xsl:element name = "value">
<xsl:apply-templates select = "*"/>
</xsl:element>
</xsl:template>
<xsl:template match = "*">
<xsl:element name = "{local-name()}">
<xsl:value-of select = "substring(*,1,3)"/>
<xsl:text disable-output-escaping = "yes"><![CDATA[</xsl:text>
<xsl:value-of select = "current()"/>
<xsl:text disable-output-escaping = "yes">]]></xsl:text>
</xsl:element>
</xsl:template>
Исключенный XML:
<response>
<ERROR_CODE>0</ERROR_CODE>
<result>
<value>
<Account><![CDATA[L01+00000F00]]></Account>
<SecurCode><![CDATA[RU000A1017H9]]></SecurCode>
<Accruedint><![CDATA[0.0000]]></Accruedint>
<ComisClear><![CDATA[0.0000]]></ComisClear>
</value>
<value>
<Account><![CDATA[1231+00000F00]]></Account>
<SecurCode><![CDATA[RU000A1017H9]]></SecurCode>
<Accruedint><![CDATA[0.12300]]></Accruedint>
<ComisClear><![CDATA[0.012300]]></ComisClear>
</value>
Данные в теге значения всегда разные (я каждый раз генерирую пользовательские поля)
Но у меня проблема с <xsl:for-each select="*">, потому что он включает ВСЕ узлы, так как я могу просто использовать foreach для тегов верхнего уровня??
Задавая вопрос XSLT, вам необходимо предоставить минимальный воспроизводимый пример: (1) Входной XML. (2) Ваша логика и XSLT, который пытается ее реализовать. (3) Желаемый результат, основанный на образце XML в #1 выше. (4) Процессор XSLT и его соответствие стандартам XSLT: 1.0, 2.0 или 3.0.
В чем польза <xsl:value-of select = "substring(*,1,3)"/>
Он используется для получения открытого и закрытого тега. 1) Выбор значения 2) Копирование 3) Получение имени тега с помощью <xsl:value-of select = "substring(*,1,3)"/> 4) Вставка значения между тегами





Пожалуйста, попробуйте следующее решение.
Он использует так называемый шаблон Преобразование личности и атрибут cdata-section-elements для включения всех нужных элементов в раздел CData.
Атрибут cdata-section-elements — это встроенная функция стандарта XSLT для добавления разделов CData.
XSLT
<?xml version='1.0'?>
<xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:output method = "xml" encoding = "utf-8" indent = "yes" cdata-section-elements = "Account SecurCode Accruedint ComisClear"/>
<xsl:strip-space elements = "*"/>
<xsl:template match = "@*|node()">
<xsl:copy>
<xsl:apply-templates select = "@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
<xsl:template match = "node()|@*">
<xsl:copy>
<xsl:apply-templates select = "node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match = "value/*">
<xsl:copy>
<xsl:value-of select = "substring(*,1,3)"/>
<xsl:text disable-output-escaping = "yes"><![CDATA[</xsl:text>
<xsl:value-of select = "current()"/>
<xsl:text disable-output-escaping = "yes">]]></xsl:text>
</xsl:copy>
</xsl:template>
Я был бы полезен, если бы вы опубликовали ожидаемые результаты.