XSLT с источником XML, который имеет пространство имен по умолчанию, установленное в xmlns
У меня есть XML-документ с пространством имен по умолчанию, указанным в корне.
Что-то вроде этого:
<MyRoot xmlns="http://www.mysite.com">
<MyChild1>
<MyData>1234</MyData>
</MyChild1>
</MyRoot>
XSLT для анализа XML не работает должным образом из-за
default namespace, т.е. когда я удаляю пространство имен, все работает как
ожидается.
Вот мой 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?
Ответы
Ответ 1
Вам нужно объявить пространство имен в XSLT и использовать его в выражениях XPath. Например:.
<xsl:stylesheet ... xmlns:my="http://www.mysite.com">
<xsl:template match="/my:MyRoot"> ... </xsl:template>
</xsl:stylesheet>
Обратите внимание, что вы должны предоставить некоторый префикс, если хотите обратиться к элементам из этого пространства имен в XPath. Хотя вы можете просто сделать xmlns="..."
без префикса, и он будет работать для литеральных элементов результата, он не будет работать для XPath - в XPath, неподписанное имя всегда считается в пространстве имен с пустым URI, независимо от любого xmlns="..."
в области.
Ответ 2
Если вы используете XSLT 2.0, укажите xpath-default-namespace="http://www.example.com"
в разделе stylesheet
.
Ответ 3
Если это была проблема с пространством имен, есть возможность попробовать изменить две вещи в файле 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>