2011-01-10 41 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>