2013-12-20 156 views
0

这里是我的XSL用于转换。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> 

这是源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> 

这是改造后的目标-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> 

回答

0

假设XSLT 2.0处理程序等撒克逊9或XmlPrime你只需要

<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> 

应该针对匹配做,但卡洛斯解决了另一个问题,即在正确的命名空间中创建新元素,因此您需要

<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> 
+0

非常感谢。这对我有用,我的问题解决了。完善! – user3123034