xslt-向所有匹配的xml子元素添加属性(不移动它们)

时间:2018-10-03 11:57:42

标签: xml xslt

在将XML导入InDesign之前,我正在使用XSLT对其进行转换。

某些元素包括带有许多子元素的文本,这些子元素的格式设置为斜体,粗体等。为了使斜体在InDesign中起作用,我想为这些子元素添加一个属性。

不幸的是,到目前为止,我仍无法弄清楚如何将属性添加到所有这些子元素中,同时又将它们保留在父元素中的相同位置。

所以我想采用一些看起来像这样的XML:

<copy_block>
    A section of text of an unknown length in which might appear <i>one or more</i> sections 
    of italics <i>which I want to add</i> an attribute to.
</copy_block>

并使用我的XSL样式表将其转换为:

<copy_block>
    A section of text of an unknown length in which might appear <i cstyle="stylename">one or more</i> sections 
    of italics <i cstyle="stylename">which I want to add</i> an attribute to.
</copy_block>

我认为这不会那么难,但是由于某种原因,我很沮丧。任何帮助将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:0)

identity template

开始
<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()" />
  </xsl:copy>
</xsl:template>

(在XSLT 3.0中,您可以仅用<xsl:mode on-no-match="shallow-copy"/>替换它)

这涉及到所有元素和节点的原样复制。然后,您需要做的就是添加一个与i匹配的覆盖模板,并为其添加属性。

<xsl:template match="i">
  <i cstyle="stylename">
    <xsl:apply-templates />
  </i>
</xsl:template>

尝试使用完整的XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="i">
    <i cstyle="stylename">
      <xsl:apply-templates />
    </i>
  </xsl:template>
</xsl:stylesheet>

http://xsltfiddle.liberty-development.net/nc4NzR2上查看它的运行情况