XSLT:复制和修改

时间:2017-02-28 13:17:31

标签: xml xslt-2.0

我有一个不属于任何其他重复和修改答案的用例。

我有以下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以原始形式复制一次,并以修改后的形式复制一次。我只复制原始表单或修改后的表单没有问题,但区分当前上下文是复制原始还是修改是一个挑战。

1 个答案:

答案 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'"/>