示例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>
答案 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。