1

質問の投稿を避けるために、私はこのフォーラムで多くのことを検索してきました。

私の入力 XML は次のようになります。


<?xml version="1.0"?>
  <table>
    <tag id="segment" name="a">
       <data>segment1</data>
    </tag>
    <tag id="data" name="b">
       <data>data1</data>
    </tag>
    <tag id="data" name="c">
       <data>data2</data>
    </tag>
    <tag id="segment" name="d">
       <data>segment2</data>
    </tag>
    <tag id="data" name="e">
       <data>data3</data>
    </tag>
    <tag id="data" name="f">
       <data>data4</data>
    </tag>
</table>

次のようなデータを出力したい:

セグメント1-データ1

セグメント1-データ2

セグメント 2 データ 3

セグメント 2 データ 4

再帰的な XSLT を試してみましたが、意図したとおりに動作するようです。どうすればこれを入手できるかについてのアイデアはありますか? ありがとう !

4

2 に答える 2

0

XSLT 1.0 に行き詰まっている場合は、これが答えです。再帰は必要ないことに注意してください。ツリーから必要な項目に対処するだけで済みます。

t:\ftemp>type segments.xml
<?xml version="1.0"?>
  <table>
    <tag id="segment" name="a">
       <data>segment1</data>
    </tag>
    <tag id="data" name="b">
       <data>data1</data>
    </tag>
    <tag id="data" name="c">
       <data>data2</data>
    </tag>
    <tag id="segment" name="d">
       <data>segment2</data>
    </tag>
    <tag id="data" name="e">
       <data>data3</data>
    </tag>
    <tag id="data" name="f">
       <data>data4</data>
    </tag>
</table>
t:\ftemp>xslt segments.xml segments1.xsl
segment1-data1
segment1-data2
segment2-data3
segment2-data4

t:\ftemp>type segments1.xsl
<?xml version="1.0" encoding="US-ASCII"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0">

<xsl:output method="text"/>

<xsl:template match="table">
  <xsl:for-each select="tag[@id='segment']">
    <xsl:variable name="prefix" select="data"/>
    <xsl:for-each select="following-sibling::tag[@id='data']
                       [generate-id(preceding-sibling::tag[@id='segment'][1])=
                        generate-id(current())]">
      <xsl:value-of select="concat($prefix,'-',data)"/>
      <xsl:text>&#xa;</xsl:text>
    </xsl:for-each>
  </xsl:for-each>
</xsl:template>

</xsl:stylesheet>
t:\ftemp>
于 2013-08-02T13:32:26.397 に答える
0

group-starting-with= で照合が行われるため、これは XSLT 2.0 のグループ化にとって非常に単純な問題です。

t:\ftemp>type segments.xml
<?xml version="1.0"?>
  <table>
    <tag id="segment" name="a">
       <data>segment1</data>
    </tag>
    <tag id="data" name="b">
       <data>data1</data>
    </tag>
    <tag id="data" name="c">
       <data>data2</data>
    </tag>
    <tag id="segment" name="d">
       <data>segment2</data>
    </tag>
    <tag id="data" name="e">
       <data>data3</data>
    </tag>
    <tag id="data" name="f">
       <data>data4</data>
    </tag>
</table>
t:\ftemp>xslt2 segments.xml segments.xsl
segment1-data1
segment1-data2
segment2-data3
segment2-data4

t:\ftemp>type segments.xsl
<?xml version="1.0" encoding="US-ASCII"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="2.0">

<xsl:output method="text"/>

<xsl:template match="table">
  <xsl:for-each-group select="tag" group-starting-with="tag[@id='segment']">
    <xsl:variable name="prefix" select="data"/>
    <xsl:for-each select="current-group()[position()>1]">
      <xsl:value-of select="concat($prefix,'-',data)"/>
      <xsl:text>&#xa;</xsl:text>
    </xsl:for-each>
  </xsl:for-each-group>
</xsl:template>

</xsl:stylesheet>
t:\ftemp>
于 2013-08-02T13:26:00.370 に答える