1

我可以使用 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>

即将包含子元素的ap 元素的不同部分包装成文本元素?

到目前为止,这是我的 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 导入 Adob​​e InDesign,但是如果我只将字符样式sub应用于子元素,则段落的后半部分(从 O 开始)仍然会在下标。我必须包装其他位以<text>使格式正确。

4

1 回答 1

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节点都具有这种行为,请编辑匹配模式以说出 eg match="p/text()[following-sibling::node()[1][self::sub]] | p/text()[preceding-sibling::node()[1][self::sub]]"

于 2013-07-31T09:35:35.183 回答