我有一个节点ID列表。我想将“-Selected”附加到给定节点id集合中的所有文本节点。请告诉我们如何使用XSL实现相同目标?
输入:
<node1 id="a">
<node2 id="b">
<node3 id="c">Text node0</node3>
<node4 id="d">
<node5 id="e">Text node1</node5>
<node6 id="f">Text node2</node6>
</node4>
</node2>
<node7 id="g">Text node3
<node8 id="h" align="center">Text node4</node8>
<node9 id="i">Text node5</node9>
</node7>
<node10 id="j">Text node6
</node10>
<node11 id="h">Text node7
</node11>
</node1>
输入参数:节点ID列表
<nodes>
<node>b</node>
<node>g</node>
<node>h</node>
</nodes>
如果输入参数有节点'a',那么我需要附加所有文本节点。
预期产出:
<node1 id="a">
<node2 id="b">
<node3 id="c">Text node0 - Selected<node3/>
<node4 id="d">
<node5 id="e">Text node1 - Selected</node5>
<node6 id="f">Text node2 - Selected</node6>
</node4>
</node2>
<node7 id="g">Text node3 - Selected
<node8 id="h" align="center">Text node4 - Selected</node8>
<node9 id="i">Text node5 - Selected</node9>
</node7>
<node10 id="j">Text node6
</node10>
<node11 id="h">Text node7 - Selected
</node11>
</node1>
答案 0 :(得分:3)
此转化:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pNodes">
<nodes>
<node>b</node>
<node>g</node>
<node>h</node>
</nodes>
</xsl:param>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[@id = $pNodes/*/*]//text()">
<xsl:value-of select="concat(., ' Selected')"/>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML文档时,会生成所需的正确结果。
答案 1 :(得分:2)
此XSLT 2.0样式表:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="pNodes">
<nodes>
<node>b</node>
<node>g</node>
<node>h</node>
</nodes>
</xsl:param>
<xsl:template match="text()" >
<xsl:value-of select="." />
<xsl:if test="ancestor::*[@id = $pNodes/*/*] and normalize-space()!=''">
<xsl:text> - Selected</xsl:text>
</xsl:if>
</xsl:template>
<xsl:template match="@* | * | comment() | processing-instruction()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
使用修改后的身份转换。 text()
上的模板匹配具有if
语句,用于评估文本节点是否为@id
元素的后代,其值与指定节点之一匹配,以及文本节点不是所有的空格(你可以根据需要调整,但不然)。如果符合这些标准,则输出“ - 选中”。
应用于样本输入,它会产生此输出:
<?xml version="1.0" encoding="UTF-8"?><node1 id="a">
<node2 id="b">
<node3 id="c"/>
<node4 id="d">
<node5 id="e">Text node1 - Selected</node5>
<node6 id="f">Text node2 - Selected</node6>
</node4>
</node2>
<node7 id="g">Text node3
- Selected<node8 id="h" align="center">Text node4 - Selected</node8>
<node9 id="i">Text node5 - Selected</node9>
</node7>
<node10 id="j">Text node6
</node10>
<node11 id="h">Text node7
- Selected</node11>
</node1>