2011-01-10 67 views
1

示例XML輸入文件:XSLT設置節點值

<sample>  
    <vars>  
     <var>  
      <name>connection1</name>  
      <value>tcp</value>  
     </var>  
     <var>  
      <name>connection2</name>  
      <value>ssl</value>  
     </var>  
    </vars>  
</sample> 

說完看着其他問題回答了,我還沒有看到,我能夠用一個例子。我希望處理上述xml文件以根據名稱節點編輯節點值。

例如找到名稱=連接1,並設置在同一組的值到SSL

輸出

<sample>  
    <vars>  
     <var>  
      <name>connection1</name>  
      <value>ssl</value>  
     </var>  
     <var>  
      <name>connection2</name>  
      <value>ssl</value>  
     </var>  
    </vars>  
</sample> 
+0

好問題,+1。請參閱我的答案以獲取最短的解決方案以及最基本的XSLT設計模式 - 身份規則模式的解釋。 – 2011-01-10 15:33:27

回答

1

可能最短的溶液是這樣的

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match= 
"var[name='connection1']/value/text()">ssl</xsl:template> 
</xsl:stylesheet> 

當這個變換所提供的XML文檔施加:

<sample> 
    <vars> 
     <var> 
      <name>connection1</name> 
      <value>tcp</value> 
     </var> 
     <var> 
      <name>connection2</name> 
      <value>ssl</value> 
     </var> 
    </vars> 
</sample> 

有用,正確的結果產生

<sample> 
    <vars> 
     <var> 
     <name>connection1</name> 
     <value>ssl</value> 
     </var> 
     <var> 
     <name>connection2</name> 
     <value>ssl</value> 
     </var> 
    </vars> 
</sample> 

說明

該解決方案使用的最基本XSLT設計模式:採用的identity rule到每個節點複製的,是其首要的匹配只需要一個特定的節點模板被改變。

+0

優秀,有點新手到xslt,這正是im後的樣子, – 2011-01-10 16:26:07

0
<xsl:template match="@* | node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="var[name = 'connection1']/value"> 
    <xsl:copy> 
    <xsl:text>ssl</xsl:text> 
    </xsl:copy> 
</xsl:template> 
0

您可以使用以下XSLT:

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

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

    <xsl:template match="value[preceding-sibling::name = 'connection1']"> 
    <value>ssl</value> 
    </xsl:template> 
</xsl:stylesheet>