0

同じレベルと特定の順序で同じ名前のノードの問題に直面しています。私の注文は、それらのノードの値によって異なります。私の出力はtxtファイルでなければなりません。私のXMLは次のようになります:

<?xml version="1.0" encoding="UTF-8"?>
<header>
  <B>
    <element>
      <value>10</value>
      <value>test</value>
    </element>
  </B>

  <A>
    <element>
      <value>100</value>
      <value>message</value>
    </element>
  </A>
  <B>
    <element>
      <value>20</value>
      <value>phase</value>
    </element>
  </B>

  <A>
    <element>
      <value>101</value>
      <value>type</value>
    </element>
  </A>
  <B>
    <element>
      <value>20</value>
      <value>phase</value>
    </element>
  </B>

  <A>
    <element>
      <value>101</value>
      <value>type</value>
    </element>
  </A>
</header>

私のtxt出力はそのように見えるはずです。

タイプフェーズ タイプフェーズ

等々。

私のXSLはそのように見えます

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="text" indent="yes" />
<xsl:template match="header/*">

        <xsl:if test="name(.) = 'A' and element/value='101'">
            <xsl:value-of select="element/value[position()=2]" />
        </xsl:if>
        <xsl:if test="name(.) = 'B' and element/value='20'">
            <xsl:value-of select="element/value[position()=2]" />
        </xsl:if>
        <xsl:text>&#xa;</xsl:text>      
</xsl:template>

<xsl:template match="/">
    <xsl:apply-templates select="header/*"></xsl:apply-templates>
</xsl:template>

この XSL の結果は次のとおりです。

フェーズ タイプ フェーズ タイプ

元の入力 XML にはさらに多くのノードがあるため、xsl:sort 降順は役に立ちません。入力 XML ドキュメントからではなく、XSL からの注文が必要です。これを解決する方法を知っている人はいますか?

4

1 に答える 1

0

入力 XML には常にBABAの順序で要素が含まれており、欠落している要素はないと仮定しました。また、 A要素とB要素の両方が正しい値を持っている場合にのみ、ペアで表示する必要があると仮定しました。

この XSLT スタイルシート:

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

  <!-- Match the root element and apply-templates to all its child elements. -->
  <xsl:template match="header">
    <xsl:apply-templates/>
  </xsl:template>

  <!-- Find A elements with a value of 101, where the B element just before has a value of 20. -->
  <xsl:template match="A[element/value='101'][preceding-sibling::B[1][element/value='20']]">
    <xsl:value-of select="element/value[2]"/>
    <xsl:value-of select="preceding-sibling::B[1]/element/value[2]"/>
    <xsl:text> </xsl:text>
  </xsl:template>

  <!-- Don't do anything with other A elements. -->
  <xsl:template match="A"/>

  <!-- Don't do anything else with B elements. -->
  <xsl:template match="B"/>

</xsl:stylesheet>

次の XML に適用した場合:

<?xml version="1.0" encoding="UTF-8"?>
<header>
  <B>
    <element>
      <value>10</value>
      <value>test1</value>
    </element>
  </B>
  <A>
    <element>
      <value>100</value>
      <value>message1</value>
    </element>
  </A>
  <B>
    <element>
      <value>20</value>
      <value>phase2</value>
    </element>
  </B>
  <A>
    <element>
      <value>101</value>
      <value>type2</value>
    </element>
  </A>
  <B>
    <element>
      <value>20</value>
      <value>phase3</value>
    </element>
  </B>
  <A>
    <element>
      <value>101</value>
      <value>type3</value>
    </element>
  </A>
</header>

次の出力が生成されます。

type2phase2 type3phase3 

value何が出力されているかを明確にするために、例の要素に番号を追加しました。

于 2013-09-12T12:09:40.697 に答える