XSLT:围绕其他标签创建新标签

时间:2013-07-31 09:21:08

标签: xml xslt adobe-indesign

我可以使用XSLT转换以下XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root>
<p>The chemical formula for water is H<sub>2</sub>O. The rest of this paragraph is not relevant.</p>
<p>Another paragraph without subscripts.</p>
</Root>

到此:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root>
<p><text>The chemical formula for water is H</text><sub>2</sub><text>O. The rest of this paragraph is not relevant.</text></p>
<p>Another paragraph without subscripts.</p>
</Root>

即。将包含子元素的p元素的不同部分包装到文本元素中?

到目前为止,这是我的XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="Root|p">
    <xsl:copy>
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>
<xsl:template match="p[child::*[name()='sub']]">
    <xsl:copy>
        <xsl:element name="text">
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:copy>
</xsl:template>
<xsl:template match="sub">
    <xsl:copy>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>

但是这会将整个段落包装成<text>元素,并且不会将其划分为 2 。我怎样才能做到我想要的呢?


一些背景信息,如果您感兴趣:我想将XML导入Adobe InDesign,但如果我只将字符样式 sub 应用于子元素,则段落的后半部分(从O开始)仍将在下标中。我必须将<text>中的其他位换行以使格式化正确。

1 个答案:

答案 0 :(得分:2)

text个节点上进行匹配:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">

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


<xsl:template match="text()[following-sibling::node()[1][self::sub]]
                     | text()[preceding-sibling::node()[1][self::sub]]">
  <text>
    <xsl:value-of select="."/>
  </text>
</xsl:template>

</xsl:stylesheet>

当然,如果您不希望所有text个节点都采用该行为,那么请编辑匹配模式,例如match="p/text()[following-sibling::node()[1][self::sub]] | p/text()[preceding-sibling::node()[1][self::sub]]"