我有以下XML代码
<para>Lorem ipsum <link>dolor</link> sit amet</para>
我想转换为
<para>Lorem ipsum </para><link>dolor</link><para> sit amet</para>
换句话说:我想将para元素拆分到link元素所在的位置。有没有提示?
答案 0 :(得分:3)
此转化:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="no"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="para/text()">
<para><xsl:copy-of select="."/></para>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML文档:
<para>Lorem ipsum <link>dolor</link> sit amet</para>
生成想要的正确结果:
<para>Lorem ipsum </para><link>dolor</link><para> sit amet</para>
请注意:
使用身份规则按原样复制每个节点。
覆盖身份规则以及仅用于处理特定节点的模板
最简单和最强大的功能。
答案 1 :(得分:0)
此样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="@*|node()[1]"/>
</xsl:copy>
<xsl:apply-templates select="following-sibling::node()[1]"/>
</xsl:template>
<xsl:template match="para">
<xsl:copy>
<xsl:apply-templates select="@*|node()[1]"/>
</xsl:copy>
<xsl:apply-templates select="link" mode="copy"/>
<xsl:apply-templates select="following-sibling::node()[1]"/>
</xsl:template>
<xsl:template match="para/link"/>
<xsl:template match="para/link" mode="copy">
<xsl:copy>
<xsl:apply-templates select="@*|node()[1]"/>
</xsl:copy>
<para>
<xsl:apply-templates select="following-sibling::node()[1]"/>
</para>
</xsl:template>
</xsl:stylesheet>
输出:
<para>Lorem ipsum </para><link>dolor</link><para> sit amet</para>
注意:细粒度遍历。
修改:压缩代码:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="@*|node()[1]"/>
</xsl:copy>
<xsl:apply-templates select="self::para/link" mode="copy"/>
<xsl:apply-templates select="following-sibling::node()[1]"/>
</xsl:template>
<xsl:template match="para/link"/>
<xsl:template match="para/link" mode="copy">
<xsl:call-template name="identity"/>
</xsl:template>
<xsl:template match="node()[preceding-sibling::node()[1]
/self::link/parent::para]">
<para>
<xsl:call-template name="identity"/>
</para>
</xsl:template>
</xsl:stylesheet>