0

私の問題は、XML 内のノードをそれらの後に発生するノードに移動したいということです f.eks: 次のような xml があります。

<root>
   <node>a</node>
   <node>b</node>
   <node>c</node>
   <top1>
   <node>d</node>
   <node>e</node>
   <top2>
</root>

そして、それは次のようになります

<root>
   <top1>
     <node>a</node>
     <node>b</node>
     <node>c</node>
   </top1>
   <top2>
     <node>d</node>
     <node>e</node>
   </top2>
</root>

しかし、これを実行できるxslはありません。position() を使用していくつか試してみましたが、どれも私に近づきません。誰でも正しいアプローチを教えてもらえますか

4

2 に答える 2

0

ここにオプションがあります:

XML 入力(整形式になるように修正)

<root>
    <node>a</node>
    <node>b</node>
    <node>c</node>
    <top1/>
    <node>d</node>
    <node>e</node>
    <top2/>
</root>

XSLT1.0

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

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

    <xsl:template match="root">
        <xsl:copy>
            <xsl:apply-templates select="@*|*[starts-with(name(),'top')]"/>
        </xsl:copy>     
    </xsl:template>

    <xsl:template match="*[starts-with(name(),'top')]">
        <xsl:copy>
            <xsl:apply-templates select="@*|preceding-sibling::node[(following-sibling::*[starts-with(name(),'top')])[1][generate-id() = generate-id(current())]]"/>
        </xsl:copy>     
    </xsl:template>

</xsl:stylesheet>

出力

<root>
   <top1>
      <node>a</node>
      <node>b</node>
      <node>c</node>
   </top1>
   <top2>
      <node>d</node>
      <node>e</node>
   </top2>
</root>
于 2012-07-12T02:35:48.840 に答える
0

私の入力は次のようなものです: これは上記の xsl では機能しません - 最上位要素の子供を削除します。

<root>
    <node>a</node>
    <node>b</node>
    <node>c</node>
    <top1>
       <node>1</node>
       <node>2</node>
    </top1>
    <node>d</node>
    <node>e</node>
    <top2>
       <node>3</node>
       <node>4</node>
    </top2>
</root>
于 2012-07-12T07:11:20.553 に答える