我有一个不属于任何其他重复和修改答案的用例。
我有以下XML片段:
<Elements>
<Irrelevant/>
<Item>
<Misc. subelements>
<Name>A</Name>
<Misc. subelements>
</Item>
<Irrelevant/>
<Item>
<Misc. subelements>
<Name>B</Name>
<Misc. subelements>
</Item>
</Elements>
并需要将其转换为以下片段(后缀&#34; _x&#34;通过传入的模板参数注入,但对于答案,它可以假设始终为&#34; _x&#34):
<Elements>
<Irrelevant/>
<Item>
<Misc. subelements (copied as-is)>
<Name>A</Name>
<Misc. subelements (copied as-is)>
</Item>
<Item>
<Misc. subelements (copied as-is)>
<Name>A_x</Name>
<Misc. subelements (copied as-is)>
</Item>
<Irrelevant/>
<Item>
<Misc. subelements (copied as-is)>
<Name>B</Name>
<Misc. subelements (copied as-is)>
</Item>
<Item>
<Misc. subelements (copied as-is)>
<Name>B_x</Name>
<Misc. subelements (copied as-is)>
</Item>
</Elements>
即。每个Item
以原始形式复制一次,并以修改后的形式复制一次。我只复制原始表单或修改后的表单没有问题,但区分当前上下文是复制原始还是修改是一个挑战。
答案 0 :(得分:3)
从身份转换模板
开始<xsl:template match="@* | node()" mode="#all">
<xsl:copy>
<xsl:apply-templates select="@* | node()" mode="#current"/>
</xsl:copy>
</xsl:template>
然后为Item
元素添加模板
<xsl:template match="Item">
<xsl:copy-of select="."/>
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="node()" mode="change"/>
</xsl:copy>
</xsl:template>
然后在模式Name
change
元素编写模板
<xsl:template match="Name" mode="change">
<xsl:copy>
<xsl:value-of select="concat(., $suffix)"/>
</xsl:copy>
</xsl:template>
使用全局参数<xsl:param name="suffix" select="'_x'"/>
。