XSL:匹配模板不起作用

时间:2013-12-20 14:43:03

标签: templates xslt namespaces

这是我的XSL转换。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" /> 
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template> 
<xsl:template match="EL3">
    <te>ABC</te>
</xsl:template> 

这是我想要转换的Source-XML。

<EL1 xmlns="http://anyurl.com" language="2">
<EL2>
    <set1>
        <value1>12</value1>
        <value2>34</value2>
        <value3>45</value3>         
    </set1>
</EL2>
<EL2>
    <set1>
        <value1>AB</value1>
        <value2>CD</value2>
        <value3>EF</value3>
        <EL3>
            <value1>AB</value1>
            <value2>CD</value2>
            <value3>EF</value3>
        </EL3>
    </set1>
</EL2>

这是转换后的Target-XML。

<EL1 xmlns="http://anyurl.com" language="2">
<EL2>
    <set1>
        <value1>12</value1>
        <value2>34</value2>
        <value3>45</value3>         
    </set1>
</EL2>
<EL2>
    <set1>
        <value1>AB</value1>
        <value2>CD</value2>
        <value3>EF</value3>
        <EL3>
            <value1>AB</value1>
            <value2>CD</value2>
            <value3>EF</value3>
        </EL3>
    </set1>
</EL2>

匹配与命名空间无关。如果我从Source-XML中删除xmlns =“http://anyurl.com”,我会得到我想要的结果。问题是我从外部系统获取Source-XML,我之前无法更改Source-XML。我如何为我等待的结果编辑XSL?

<EL1 language="2">
   <EL2>
      <set1>
         <value1>12</value1>
         <value2>34</value2>
         <value3>45</value3>
      </set1>
   </EL2>
   <EL2>
      <set1>
         <value1>AB</value1>
         <value2>CD</value2>
         <value3>EF</value3>
         <te>ABC</te>
      </set1>
   </EL2>
</EL1>

1 个答案:

答案 0 :(得分:0)

假设像Saxon 9或XmlPrime这样的XSLT 2.0处理器只需要

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xpath-default-namespace="http://anyurl.com">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" /> 
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template> 
<xsl:template match="EL3">
    <te>ABC</te>
</xsl:template>

如果您使用XSLT 1.0处理器,则需要

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:df="http://anyurl.com" exclude-result-prefixes="df">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" /> 
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template> 
<xsl:template match="df:EL3">
    <te>ABC</te>
</xsl:template>

这应该用于匹配,但Carlos解决了另一个问题,即在正确的命名空间中创建新元素,所以你需要

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xpath-default-namespace="http://anyurl.com" xmlns="http://anyurl.com">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" /> 
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template> 
<xsl:template match="EL3">
    <te>ABC</te>
</xsl:template>
分别

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:df="http://anyurl.com" exclude-result-prefixes="df" xmlns="http://anyurl.com">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" /> 
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template> 
<xsl:template match="df:EL3">
    <te>ABC</te>
</xsl:template>