2008-11-05 46 views
2

XSLT新手問題:我需要用XML文件中的文本值替換。所有其他節點必須保持不變。這是我的輸入文件(in.xml):僅處理選定節點

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <level1 attr1="val1"> 
     <level2>in</level2> 
    </level1> 
</root> 

這裏是我的XSLT轉化(subst.xsl):

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="/"> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="//node()"> 
     <xsl:copy> 
      <xsl:apply-templates /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/root/level1/level2/text()">out</xsl:template> 
</xsl:stylesheet> 

我用下面的Ant腳本(build.xml文件)運行:

<?xml version="1.0" encoding="UTF-8"?> 
<project name="test" default="test" basedir="."> 
    <target name="test"> 
     <xslt style="subst.xsl" in="in.xml" out="out.xml" /> 
    </target> 
</project> 

這裏就是我得到(out.xml):

<?xml version="1.0" encoding="UTF-8"?><root> 
    <level1> 
     <level2>out</level2> 
    </level1> 
</root> 

缺少「level1」的屬性「attr1」。

我會很感激,如果有人

  • 告訴我有什麼錯subst.xsl

OR

  • 給我一個想法如何強制XSLT處理器只是將不匹配的節點複製到輸出文件並手動執行(這在我的情況下是error-p羅內)。

回答

11

您的身份轉換缺少屬性(顯然)。改爲:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

然後,只需添加您的最後一個模板。