不匹配 xslt 模板中的前缀命名空间
Match not prefix namespace in xslt template
我有 XML 需要按类型标签排序。此 XML 还具有带有命名空间的 ContractSummary 标记。我试图通过将 namespace-uri()='ContractSummary' 添加到模板来找到 ContractSummary 标记,但它不起作用。
此外,不允许更改 xsl:stylesheet 标记,因为它是硬编码的。
请帮助我更改模板以使用 ContractSummary 标记中的命名空间。
2.0 中的 XSLT 版本。
<ContractSummary xmlns="ContractSummary" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="ContractSummary schema.xsd">
<Offerings>
<Type>Product2</Type>
<Name Language="NL">Cable Access</Name>
</Offerings>
<Offerings>
<Type>Product1</Type>
<Name Language="ZFR">Enlvement</Name>
</Offerings> </ContractSummary>
XSLT 模板:
<xsl:template match="//*[local-name()='ContractSummary' and namespace-uri()='ContractSummary' ]">
<xsl:copy>
<xsl:apply-templates select="Offerings">
<xsl:sort select="Type" />
</xsl:apply-templates>
</xsl:copy> </xsl:template>
结果我有:
<ContractSummary xmlns="ContractSummary" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></ContractSummary>
我需要xml:
<ContractSummary xmlns="ContractSummary" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Offerings>
<Type>Product1</Type>
<Name Language="ZFR">Enlvement</Name>
</Offerings>
<Offerings>
<Type>Product2</Type>
<Name Language="NL">Cable Access</Name>
</Offerings></ContractSummary>
您的指令:
<xsl:apply-templates select="Offerings">
不执行任何操作,因为 Offerings
也在命名空间中(Type
也是)。此外,没有必要使用像 *[local-name()='ContractSummary'
.
这样的 hack
正确地,您可以在 xsL;stylesheet
开始标记中声明一个默认命名空间。你说你不能改变它(为什么?)所以试试:
<xsl:template match="ContractSummary" xpath-default-namespace="ContractSummary">
<xsl:copy>
<xsl:apply-templates select="Offerings">
<xsl:sort select="Type" />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
当然,这假设您还有一个匹配 Offerings
.
的模板
我有 XML 需要按类型标签排序。此 XML 还具有带有命名空间的 ContractSummary 标记。我试图通过将 namespace-uri()='ContractSummary' 添加到模板来找到 ContractSummary 标记,但它不起作用。 此外,不允许更改 xsl:stylesheet 标记,因为它是硬编码的。
请帮助我更改模板以使用 ContractSummary 标记中的命名空间。
2.0 中的 XSLT 版本。
<ContractSummary xmlns="ContractSummary" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="ContractSummary schema.xsd">
<Offerings>
<Type>Product2</Type>
<Name Language="NL">Cable Access</Name>
</Offerings>
<Offerings>
<Type>Product1</Type>
<Name Language="ZFR">Enlvement</Name>
</Offerings> </ContractSummary>
XSLT 模板:
<xsl:template match="//*[local-name()='ContractSummary' and namespace-uri()='ContractSummary' ]">
<xsl:copy>
<xsl:apply-templates select="Offerings">
<xsl:sort select="Type" />
</xsl:apply-templates>
</xsl:copy> </xsl:template>
结果我有:
<ContractSummary xmlns="ContractSummary" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></ContractSummary>
我需要xml:
<ContractSummary xmlns="ContractSummary" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Offerings>
<Type>Product1</Type>
<Name Language="ZFR">Enlvement</Name>
</Offerings>
<Offerings>
<Type>Product2</Type>
<Name Language="NL">Cable Access</Name>
</Offerings></ContractSummary>
您的指令:
<xsl:apply-templates select="Offerings">
不执行任何操作,因为 Offerings
也在命名空间中(Type
也是)。此外,没有必要使用像 *[local-name()='ContractSummary'
.
正确地,您可以在 xsL;stylesheet
开始标记中声明一个默认命名空间。你说你不能改变它(为什么?)所以试试:
<xsl:template match="ContractSummary" xpath-default-namespace="ContractSummary">
<xsl:copy>
<xsl:apply-templates select="Offerings">
<xsl:sort select="Type" />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
当然,这假设您还有一个匹配 Offerings
.