XSL-преобразование xml с символьными сущностями в именах элементов - PullRequest
0 голосов
/ 04 февраля 2019

Мой xml выглядит следующим образом:

<record>
    <name>ABC</name>
    <address>
        &lt;street&gt;sss&lt;/street&gt;
        &lt;city&gt;ccc&lt;/city&gt;
        &lt;state&gt;ttt&lt;/state&gt;
    </address>
</record>

Я пытаюсь прочитать элемент 'street', используя 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 ]

0 голосов
/ 04 февраля 2019

Нет элемента street.Если бы оно было написано <street>...</street>, то это был бы элемент, но угловые скобки были тщательно исключены, чтобы указать, что его следует рассматривать как простой текст.

Преобразование простого текста, содержащего угловые скобки, в структуру узла XMLвключает в себя разбор;то есть вам нужно выполнить второй анализ текстового содержимого элемента address.Это осложняется тем фактом, что у вас есть фрагмент XML, а не полный документ XML.

В XSLT 3.0 вы можете добиться этого с помощью функции parse-xml-фрагмент ().В более ранних выпусках вы могли достичь этого, вызывая пользовательские функции расширения или (как предполагает @sandeepkamboj), написав простой синтаксический анализатор XML в XSLT (для этого вам нужно быть уверенным, что вы знаете, какое подмножество XMLконструкции, которые вам нужно обработать).

Возможно, лучший способ - выяснить, почему кто-то сгенерировал этот нелепый документ, и заставить их исправлять свои пути.

0 голосов
/ 04 февраля 2019

Чтобы добавить к ответу Майкла Кея:

Если вы начнете с обработки вашего 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>

и сохранитеПосле этого вы сможете использовать свою таблицу стилей для обработки полученного файла и получения ожидаемого результата.

0 голосов
/ 04 февраля 2019
    <xsl:template match="//name"/>
<xsl:template match="record/address">
    <xsl:value-of select="substring-before(., '&lt;city&gt;ccc&lt;/city&gt;')" disable-output-escaping="yes"/>
</xsl:template>

проверьте этот код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...