情報を取得し、並べ替え、XSLTを使用した唯一の識別子を持つ要素のサブセットにする方法?

StackOverflow https://stackoverflow.com/questions/2418515

  •  19-09-2019
  •  | 
  •  

質問

私は、XSLTに新たなんだと私は次のような問題を解決することはできません。

私はこのようなxmlファイルを持っています:

<root>
    <subset>
        <e id="A"></e>
        <e id="C"></e>
    </subset>

    <data>
        <info id="A" order="3" name="ANode"></info>
        <info id="B" order="4" name="BNode"></info>
        <info id="C" order="1" name="CNode"></info>
        <info id="D" order="2" name="DNode"></info>
    </data>
</root>

そして、私はこれを生産したいです

<root>
    <newnode id="C" order="1" name="CNode"></newnode>
    <newnode id="A" order="3" name="ANode"></newnode>
</root>

あなたが見ることができるようにアイデアは、それぞれの情報を取得することで、idのサブセットを「完了」、および<data>に指定された彼らのためにそれに応じてそれらを並べ替えることです。

<data>は、子ノードの多くを持っていることになっていることに注意してください。

私は多くのサブセットを持つことになりますと、私は「どこでも」情報を繰り返しているにしたくないので、

また、私は、IDSのサブセットから<data>要素に関する情報をノードとを分離しています。

事前に感謝します。

役に立ちましたか?

解決

また、あなたはあなたの実際のデータをどうする必要があるかもしれない他に何に依存するサブセットのOFFキー可能性があります。

<xsl:output indent="yes" />

<xsl:key name="subset" match="e" use="@id" />

<xsl:template match="/">
    <root>
    <xsl:for-each select="//info[count(key('subset',@id)[1]) &gt; 0]">
        <xsl:sort select="@order" data-type="number" />
        <newnode id="{@id}" order="{@order}" name="{@name}" />
    </xsl:for-each>
    </root>
</xsl:template>

他のヒント

クロスリファレンスは、キーを使用するために尋ねるます:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

  <xsl:output indent="yes"/>

  <xsl:key name="k1" match="info" use="@id"/>

  <xsl:template match="root">
    <xsl:copy>
      <xsl:apply-templates select="subset/e">
        <xsl:sort select="key('k1', @id)/@order" data-type="number"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="e">
    <newnode id="{@id}" order="{key('k1', @id)/@order}" name="{key('k1', @id)/@name}"/>
  </xsl:template>

</xsl:stylesheet>

それはあなたが提示入力サンプルのために行う必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top