2013-12-20 44 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