Есть две причины, по которым <xsl:value-of select="id"/>
ничего не возвращает.
Во-первых, ваш шаблон соответствует "/"
, который является узлом документа.Это родительский узел ns2:pointOfSale
в вашем XML.Узел документа не имеет id
как дочерний элемент, поэтому <xsl:value-of select="id"/>
не найдет ничего.Чтобы исправить это, вы должны сопоставить корневой элемент (в данном случае ns2:pointOfSale
) вместо
<xsl:template match="/*">
Вторая проблема связана с пространствами имен.Предполагая, что в вашем XML есть объявление пространства имен в форме xmlns:ns2="xxx.xxxx"
, вы бы добавили такое же объявление в свой XSLT (для элемента xsl:stylesheet
), а затем могли бы это сделать.
<xsl:value-of select="ns2:id"/>
Без какой-либо ссылкик пространству имен в вашем XSLT, он будет искать элемент id
без пространства имен.
Попробуйте этот XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
exclude-result-prefixes="xs xd"
xmlns:ns2="xxx.xxxx"
version="2.0">
<xsl:output method="xml" version="1.0" encoding="utf-8" omit-xml-declaration="no" indent="no" />
<xsl:strip-space elements="*" />
<xsl:template match="/*">
<xsl:element name="clients">
<xsl:attribute
name="xsi:noNamespaceSchemaLocation">setClients.xsd</xsl:attribute>
<xsl:attribute name="encryptedData">N</xsl:attribute>
<xsl:element name="client">
<xsl:attribute name="clientID" >
<xsl:value-of select="ns2:id"/>
</xsl:attribute>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
На самом деле, поскольку вы используете XSLT 2.0, вы могли бывместо этого используйте xpath-default-namespace
, что будет означать, что XSLT будет рассматривать любой нефиксированный элемент в выражении select
как часть этого пространства имен.
Попробуйте это тоже ....
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
exclude-result-prefixes="xs xd"
xpath-default-namespace="xxx.xxxx"
version="2.0">
<xsl:output method="xml" version="1.0" encoding="utf-8" omit-xml-declaration="no" indent="no" />
<xsl:strip-space elements="*" />
<xsl:template match="/*">
<xsl:element name="clients">
<xsl:attribute
name="xsi:noNamespaceSchemaLocation">setClients.xsd</xsl:attribute>
<xsl:attribute name="encryptedData">N</xsl:attribute>
<xsl:element name="client">
<xsl:attribute name="clientID" >
<xsl:value-of select="id"/>
</xsl:attribute>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
ЛучшеТем не менее, используйте шаблоны значений атрибутов (и избегайте использования xsl:element
), чтобы упростить XSLT до этого ...
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
exclude-result-prefixes="xs xd"
xpath-default-namespace="xxx.xxxx"
version="2.0">
<xsl:output method="xml" version="1.0" encoding="utf-8" omit-xml-declaration="no" indent="no" />
<xsl:strip-space elements="*" />
<xsl:template match="/*">
<clients xsi:noNamespaceSchemaLocation="setClients.xsd" encryptedData="N">
<client clientID="{id}" />
</clients>
</xsl:template>
</xsl:stylesheet>