在将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>
我认为这不会那么难,但是由于某种原因,我很沮丧。任何帮助将不胜感激。
谢谢!
答案 0 :(得分:0)
<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>