XSLT在子节点处拆分

时间:2010-11-18 14:44:48

标签: xslt

我有以下XML代码

<para>Lorem ipsum <link>dolor</link> sit amet</para>

我想转换为

<para>Lorem ipsum </para><link>dolor</link><para> sit amet</para>

换句话说:我想将para元素拆分到link元素所在的位置。有没有提示?

2 个答案:

答案 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. 使用身份规则按原样复制每个节点。

  2. 覆盖身份规则以及仅用于处理特定节点的模板

  3. 使用1.和2.上面的
  4. 最简单和最强大的功能

答案 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>