Невозможно выбрать узел с присоединенным пространством имен

#xml #xslt #xpath

#xml #xslt #xpath

Вопрос:

У меня есть следующий фрагмент XML

 <?xml version="1.0" encoding="UTF-8"?>
<Sheet version="1.0" xmlns:j="http://www.it.ojp.gov/jxdm/3.0.2">
    <Subject xmlns="http://www.it.ojp.gov/jxdm/3.0.2">
        <PersonName>
            <PersonGivenName>EDWIN</PersonGivenName>
            <PersonMiddleName>J</PersonMiddleName>
            <PersonSurName>TURNER</PersonSurName>
        </PersonName>
    </Subject>
</Sheet>
  

Я использую попытку выбрать подлежащий узел со следующим XSLT

 <?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<html>
    <body>
        <xsl:value-of select="Sheet/Subject"/>
    </body>
</html>
</xsl:template>
</xsl:stylesheet>
  

Я тестировал этот сегмент на http://www.shell-tools.net/index.php?op=xslt .

Что происходит, так это то, что если я запускаю преобразование с XML, как написано, атрибут select не совпадает. Однако, если я удалю пространство имен из подлежащего узла, оно правильно выберет данные.

Я ищу синтаксис относительно того, как заставить выбор работать с пространством имен, присоединенным к узлу Subject, поскольку именно так данные поступают из веб-службы.

Ответ №1:

Вам необходимо определить псевдоним для пространства имен sheet документа. Xsl должен выглядеть следующим образом:

 <?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
    xmlns:sheet="http://www.it.ojp.gov/jxdm/3.0.2" <--- Define an alias
    exclude-result-prefixes="sheet"                <--- Prevent xslt from using this 
                                                        namespace in the output document
>
<xsl:template match="/">
<html>
    <body>
        <xsl:value-of select="Sheet/sheet:Subject"/>   <--- Use alias
    </body>
</html>
</xsl:template>
</xsl:stylesheet>