XSLT - 将现有节点放在不同的位置

时间:2015-07-21 11:00:00

标签: xml xslt xslt-2.0

我有xml如下,

<p>

我需要的是摆脱具有属性edit或foot的<section>个节点,并将它们添加到 <doc> <section> <p note="front"></p> <c>content</c> </section> <p note="edit"></p> <p note="foot"></p> <section> ....... </section> </doc> 节点的末尾。

所以输出应该是

<xsl:template match="p[@note='edit']"/>
<xsl:template match="p[@note='foot']"/>

我可以通过简单地使用如下的空模板来删除那些节点,

<section>

但我不知道任何方法如何将这些被删除的节点放在permessage-deflate节点的末尾。

有任何建议我该怎么做?

提前致谢

4 个答案:

答案 0 :(得分:2)

您可以尝试这种方式:

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="section">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
    <xsl:copy-of select="p[@note='edit' or @note='foot']"/>
  </xsl:template>

  <xsl:template match="p[@note='edit' or @note='foot']"/>
</xsl:stylesheet>

简要说明:

  • <xsl:template match="node()|@*">...:身份模板。我只是假设你熟悉它。
  • <xsl:template match="section">...:这就是将当前<p>之后具有属性编辑或脚'的'<section>节点复制到该位置的逻辑
  • <xsl:template match="p[@note='edit' or @note='foot']"/>:空模板,用于从原始位置移除'<p>节点,这些节点具有属性编辑或脚'

答案 1 :(得分:1)

对于这种情况,我建议使用xsl:在与该部分匹配的模板内选择。 此模板创建section元素并重新排序节点。

   <xsl:template match="section">
    <xsl:choose>
        <xsl:when test="p[@note= 'front']">
            <section>
                <xsl:apply-templates select="p[@note= 'front'] | c"/>
            </section>
            <xsl:apply-templates select="p[@note != 'front']"/>
        </xsl:when>
        <xsl:otherwise>
            <section>
                <xsl:apply-templates/>
            </section>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

演示:http://xsltransform.net/jyH9rNa/3

答案 2 :(得分:1)

或者简单地说:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="section">
    <xsl:variable name="footnotes" select="p[@note='edit' or @note='foot']" />
    <xsl:copy>
        <xsl:apply-templates select="@*|node() except $footnotes"/>
    </xsl:copy>
    <xsl:apply-templates select="$footnotes"/>
</xsl:template>

</xsl:stylesheet>

答案 3 :(得分:0)

在XSLT的某处,有&lt; section&gt;的输出。元素,你在里面使用&lt; xsl:template match =&#34; p [@note =&#39; edit&#39;]&#34; /&gt; (和脚)作为空模板,以避免插入这些(我猜) 就在&lt; section&gt;之后元素你可以使用元素

<xsl:template match="/doc/section/p[@note='edit']|/doc/section/p[@note='foot']">
  <xsl:copy-of select="."/> 
</xsl:template>

在这里插入这些。