我想在一个 xml 上有一些修饰,我尝试使用 xslt 句子,但我无法做到,复制后我在尝试进行更改时删除了子节点。发布 XML:
`
<tree>
<sublevel>
<definition>subnetting</definition>
<status>availabe</status>
<categories>
<category>
<label>IPV4</label>
<attributes>
<attribute>
<label>MASK</label>
<value>/24</value>
</attribute>
<attribute>
<label>STARTING_IP</label>
<value>10.0.0.1</value>
</attribute>
<attribute>
<label>Type</label>
<value>4</value>
</attribute>
</attributes>
</category>
</categories>
<identifier>subnetworkipv4correct</identifier>
</sublevel>
</tree>
我想使用一个 xslt 来执行输出:
'
<tree>
<sublevel>
<definition>subnetting</definition>
<status>availabe</status>
<origen>template</origen>
<categories>
<category>
<label>IP</label>
<attributes>
<attribute>
<label>Mask</label>
<value>/24</value>
</attribute>
<attribute>
<label>START</label>
<value>10.0.0.1</value>
</attribute>
<attribute>
<label>Version</label>
<value>4</value>
</attribute>
</attributes>
</category>
</categories>
<identifier>subnetworkipv4correct</identifier>
</sublevel>
</tree>
'
我已经测试了很多模板,但我无法做到。
你需要更准确地说明你想要做什么才能得到一个完整的答案,但希望一些指针应该会有所帮助。使用标识模板,并针对需要删除/更改的特定元素覆盖它。
要删除 origen
元素,请使用以下命令:
<xsl:template match="origen"/>
这只是匹配它,并且不输出任何内容,从而有效地删除了它。
要修改label
元素,可以使用以下内容:
<xsl:template match="category/label[. = 'IPV4']/text">IP</xsl:template>
或者:
<xsl:template match="category/label/text()">
<xsl:choose>
<xsl:when test=". = 'IPV4']">IP</xsl:when>
<xsl:otherwise>(default)</xsl:otherwise>
</xsl:choose>
</xsl:template>
您可以通过类似的方式更改其他元素的值。
此转换:
<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()" name="identity">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="status[. = 'availabe']">
<xsl:call-template name="identity"/>
<origen>template</origen>
</xsl:template>
<xsl:template match="label/text()[. = 'IPV4']">IP</xsl:template>
<xsl:template match="label/text()[. = 'STARTING_IP']">START</xsl:template>
<xsl:template match="label/text()[. = 'Type']">Version</xsl:template>
</xsl:stylesheet>
应用于提供的 XML 文档时:
<tree>
<sublevel>
<definition>subnetting</definition>
<status>availabe</status>
<categories>
<category>
<label>IPV4</label>
<attributes>
<attribute>
<label>MASK</label>
<value>/24</value>
</attribute>
<attribute>
<label>STARTING_IP</label>
<value>10.0.0.1</value>
</attribute>
<attribute>
<label>Type</label>
<value>4</value>
</attribute>
</attributes>
</category>
</categories>
<identifier>subnetworkipv4correct</identifier>
</sublevel>
</tree>
产生完全想要的结果:
<tree>
<sublevel>
<definition>subnetting</definition>
<status>availabe</status>
<origen>template</origen>
<categories>
<category>
<label>IP</label>
<attributes>
<attribute>
<label>MASK</label>
<value>/24</value>
</attribute>
<attribute>
<label>START</label>
<value>10.0.0.1</value>
</attribute>
<attribute>
<label>Version</label>
<value>4</value>
</attribute>
</attributes>
</category>
</categories>
<identifier>subnetworkipv4correct</identifier>
</sublevel>
</tree>
注意:要更系统和牢固地掌握 XSLT,请观看我的 Pluralsight 课程"XSLT 2.0 和 1.0 基础"
另请参阅:https://stackoverflow.com/a/322079/36305