我有以下 XML输入:
<?xml version="1.0" encoding="UTF-8"?>
<parent>
<para>
<emphasis>
<emphasis>
blah 0
<Xref ref="1"/>
blah 1
</emphasis>
</emphasis>
</para>
<para>
blah 2 <Xref ref="2"/> blah 3
</para>
</parent>
我想将Xref
节点放置在para节点之外,无论它们有多深。
使用以下 XSLT 1.0 代码:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:template match="@*|node()" priority="0">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:key name="kPrecedingXref" match="node()[not(self::Xref)]" use="generate-id(following-sibling::Xref[1])"/>
<xsl:template match="para[Xref]" priority="1">
<xsl:apply-templates select="Xref"/>
<xsl:if test="count(Xref/following-sibling::node())>0">
<para>
<xsl:apply-templates select="Xref/following-sibling::node()[not(self::Xref) and not(following-sibling::Xref)]"/>
</para>
</xsl:if>
</xsl:template>
<xsl:template match="Xref" priority="1">
<xsl:if test="parent::para">
<para>
<xsl:apply-templates select="key('kPrecedingXref',generate-id())"/>
</para>
</xsl:if>
<toolRef><xsl:value-of select="@ref"/></toolRef>
</xsl:template>
<xsl:template match="emphasis[Xref]" priority="1">
<xsl:copy>
<xsl:apply-templates select="node()[following-sibling::Xref]" />
</xsl:copy>
<xsl:apply-templates select="Xref"/>
<xsl:copy>
<xsl:apply-templates select="node()[preceding-sibling::Xref]" />
</xsl:copy>
</xsl:template>
</xsl:transform>
可以处理此问题,但只能将Xref
个节点置于其直接父节点之外。
如何更改此代码以获取此信息:
想要的输出
<parent>
<para>
<emphasis>
<emphasis>
blah 0
</emphasis>
</emphasis>
</para>
<toolRef>1</toolRef>
<para>
<emphasis>
<emphasis>
blah 1
</emphasis>
</emphasis>
</para>
<para>blah 2 </para>
<toolRef>2</toolRef>
<para> blah 3</para>
</parent>
完整的示例代码为:http://xsltransform.net/nbiCsZM/4