XSL-преобразование xml с символьными сущностями в именах элементов
Мой XML выглядит так:
<record>
<name>ABC</name>
<address>
<street>sss</street>
<city>ccc</city>
<state>ttt</state>
</address>
</record>
Я пытаюсь прочитать элемент "улица" с помощью xsl:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="yes" indent="yes" />
<xsl:template match="/">
<xsl:value-of select="record/address/street" />
</xsl:template>
</xsl:stylesheet>
но это не дает никакого выхода.
Почему это происходит, даже если входной XML-файл имеет допустимый XML-формат? Итак, как преобразовать XML-файлы, содержащие символьные объекты для имен элементов?
3 ответа
Чтобы добавить к ответу Майкла Кея:
Если вы начинаете с обработки вашего XML с помощью:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="address">
<xsl:copy>
<xsl:value-of select="." disable-output-escaping="yes"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
и сохраните результат в файл, вы сможете использовать свою таблицу стилей для обработки полученного файла и получения ожидаемого результата.
Здесь нет street
элемент. Если бы это было написано <street>...</street>
тогда это был бы элемент, но угловые скобки были тщательно исключены, чтобы указать, что его следует рассматривать как простой текст.
Преобразование обычного текста, содержащего угловые скобки, в структуру узла XML включает анализ; то есть вам нужно выполнить второй анализ текстового содержимого address
элемент. Это осложняется тем, что у вас есть фрагмент XML, а не полный документ XML.
В XSLT 3.0 вы можете добиться этого, используя функцию parse-xml-frag (). В более ранних выпусках вы могли достичь этого, вызывая пользовательские функции расширения или (как предполагает @sandeepkamboj), написав простой синтаксический анализатор XML в XSLT (для этого вам нужно быть уверенным, что вы знаете, какое подмножество XML конструкции вам нужно обрабатывать).
Возможно, лучший подход - выяснить, почему кто-то сгенерировал этот нелепый документ, и заставить его исправить свои пути.
<xsl:template match="//name"/>
<xsl:template match="record/address">
<xsl:value-of select="substring-before(., '<city>ccc</city>')" disable-output-escaping="yes"/>
</xsl:template>
проверьте этот код.