xslt在父组中设置节点值

时间:2011-01-10 15:01:43

标签: xml xslt xpath

示例XML输入文件:

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

看了其他问题后,我还没有看到一个我可以使用的例子。我希望处理上面的xml文件,根据名称节点编辑节点值。

e.g。找到name = connection1并将同一组中的值设置为SSL

输出

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

4 个答案:

答案 0 :(得分: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 按原样复制每个节点,并通过匹配仅需要的特定节点的模板覆盖改变了。

答案 1 :(得分: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>

答案 2 :(得分: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>

答案 3 :(得分:0)

使用XSL Identity Transform以及处理特定案例的模板,并将ssl替换为tcp。