Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml xslt在父组中设置节点值_Xml_Xslt_Xpath - Fatal编程技术网

Xml xslt在父组中设置节点值

Xml xslt在父组中设置节点值,xml,xslt,xpath,Xml,Xslt,Xpath,示例XML输入文件: <sample> <vars> <var> <name>connection1</name> <value>tcp</value> </var> <var> <name>co

示例XML输入文件:

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

连接1
tcp
连接2
ssl
看过其他回答的问题后,我还没有看到一个我能够使用的例子。我希望处理上述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>

连接1
ssl
连接2
ssl

ssl

ssl

您可以使用以下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>

ssl

您可以使用以下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>

ssl

使用与模板一起处理您的特定案例并用ssl替代tcp。

使用与模板一起处理您的特定案例并用ssl替代tcp。

最短的解决方案可能是这样的:

<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>
<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>

ssl
当此转换应用于提供的XML文档时

<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>
<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>

连接1
tcp
连接2
ssl
生成所需的正确结果

<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>
<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>

连接1
ssl
连接2
ssl
说明

<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>
<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设计模式:使用按原样复制每个节点,并由与只需更改的特定节点匹配的模板覆盖。

最短的解决方案可能是:

<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>
<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>

ssl
当此转换应用于提供的XML文档时

<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>
<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>

连接1
tcp
连接2
ssl
生成所需的正确结果

<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>
<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>

连接1
ssl
连接2
ssl
说明

<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>
<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设计模式:使用按原样复制每个节点,并由与只需更改的特定节点匹配的模板覆盖。

好问题,+1。关于最短的解决方案和最基本的XSLT设计模式——标识规则模式的解释,请参见我的答案。好问题,+1。请参阅我的答案,了解最基本的XSLT设计模式——标识规则模式。非常好,对XSLT有点陌生,这正是我想要的,非常好,对XSLT有点陌生,这正是我想要的,