不匹配 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.

的模板

演示:https://xsltfiddle.liberty-development.net/93wniV8