XSLT - 将第n个第一个孩子作为第一个孩子移动并放置其余孩子

时间:2016-07-11 10:34:00

标签: xslt

我试图将引用xml转换为其他特定于dtd的

输入:

<ref>
   <a>text</a>
   <b>text</b>
   <c>text</c>
   <d>text</d>
</ref>

XSLT:

<xsl:template match="ref">
    <ref>
        <h>
            <xsl:apply-templates select="./a"/>
        </h>
        <g>
            <xsl:apply-templates />
        </g>
    </ref>
</xsl:template>

<xsl:template match="ref/a">
    <a>
        <xsl:apply-templates />
    </a>
</xsl:template>

输出派生:

<ref>
  <h>
     <a>text</a>
  </h>
  <g>
     <a>text</a>
     <b>text</b>
     <c>text</c>
     <d>text</d>
  </g>
</ref>

期望的输出:

<ref>
  <h>
     <a>text</a>
  </h>
  <g>
     <b>text</b>
     <c>text</c>
     <d>text</d>
  </g>
</ref>

我应该使用模式来执行此操作还是应该调用模板,如果是这样的话。

3 个答案:

答案 0 :(得分:0)

我怀疑这更像是你想做的事情:

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

  <xsl:template match="ref">
    <ref>
      <h>
        <xsl:apply-templates select="./*[1]"/>
      </h>
      <g>
        <xsl:apply-templates select="./*[generate-id() != generate-id(../*[1])]"/>
      </g>
    </ref>
  </xsl:template>

  <xsl:template match="ref/*">
    <xsl:copy>
      <xsl:apply-templates />
    </xsl:copy>
  </xsl:template>

答案 1 :(得分:0)

而不是

    <g>
        <xsl:apply-templates />
    </g>

使用

    <g>
        <xsl:apply-templates select="node() except a"/>
    </g>

在XSLT 2.0中

答案 2 :(得分:0)

最后使用'模式'来完成它。

<xsl:template match="ref">
   <ref>
      <h>
        <xsl:apply-templates select="./a" mode="add"/>
      </h>
      <g>
        <xsl:apply-templates />
      </g>
   </ref>
</xsl:template>

<xsl:template match="ref/a"/>
<xsl:template match="ref/a" mode="add">
    <a>
       <xsl:apply-templates />
    </a>
</xsl:template>