XSLT с источником XML, для пространства имен по умолчанию которого задано значение xmlns - PullRequest
57 голосов
/ 28 августа 2009

У меня есть XML-документ с пространством имен по умолчанию, указанным в корне. Примерно так:

<MyRoot xmlns="http://www.mysite.com">
   <MyChild1>
       <MyData>1234</MyData> 
   </MyChild1> 
</MyRoot>

XSLT для анализа XML не работает должным образом из-за пространство имен по умолчанию, т.е. когда я удаляю пространство имен, все работает как ожидается.

Вот мой XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:template match="/" >
  <soap:Envelope xsl:version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
     <NewRoot xmlns="http://wherever.com">
       <NewChild>
         <ChildID>ABCD</ChildID>
         <ChildData>
            <xsl:value-of select="/MyRoot/MyChild1/MyData"/>
         </ChildData>
       </NewChild>
     </NewRoot>
   </soap:Body>
  </soap:Envelope>
 </xsl:template>
</xsl:stylesheet>

Что нужно сделать с документом XSLT, чтобы перевод работал правильно? Что именно нужно сделать в документе XSLT?

Ответы [ 3 ]

64 голосов
/ 28 августа 2009

Вам необходимо объявить пространство имен в вашем XSLT и использовать его в выражениях XPath. E.g.:

<xsl:stylesheet ... xmlns:my="http://www.mysite.com">

   <xsl:template match="/my:MyRoot"> ... </xsl:template>

</xsl:stylesheet>

Обратите внимание, что вы должны предоставить некоторый префикс, если вы хотите ссылаться на элементы из этого пространства имен в XPath. Хотя вы можете просто сделать xmlns="..." без префикса, и он будет работать для буквальных элементов результата, он не будет работать для XPath - в XPath нефиксированное имя всегда считается находящимся в пространстве имен с пустым URI, независимо от любого * В объеме 1007 *.

27 голосов
/ 04 апреля 2011

Если вы используете XSLT 2.0, укажите xpath-default-namespace="http://www.example.com" в разделе stylesheet.

4 голосов
/ 28 марта 2012

Если это была проблема с пространством имен, есть место, чтобы попытаться изменить две вещи в файле xslt:

  • добавить определение "моего" пространства имен в тег xsl: stylesheet
  • использовать префикс "my:" при вызове элементов при обходе XML-файла.

результат

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="http://www.w3.org/2001/XMLSchema">
    <xsl:template match="/" >
        <soap:Envelope xsl:version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
            <soap:Body>
                <NewRoot xmlns="http://wherever.com">
                    <NewChild>
                        <ChildID>ABCD</ChildID>
                        <ChildData>
                            <xsl:value-of select="/my:MyRoot/my:MyChild1/my:MyData"/>
                        </ChildData>
                    </NewChild>
                </NewRoot>
            </soap:Body>
        </soap:Envelope>
    </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...