我可以使用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>
中的其他位换行以使格式化正确。
答案 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]]"
。