Xml xslt在父组中设置节点值
示例XML输入文件:Xml xslt在父组中设置节点值,xml,xslt,xpath,Xml,Xslt,Xpath,示例XML输入文件: <sample> <vars> <var> <name>connection1</name> <value>tcp</value> </var> <var> <name>co
<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有点陌生,这正是我想要的,