0

この xml の場合:

 <G>
        <P>
            <A>
                <b>value b</b>
                <c>value c</c>
            </A>
            <A>
                <b>value b2</b>
                <c>value c2</c>
            </A>
            <D>value ew</D>
        <D>value e2</D>     
            <E>value f</E>
        </P>
        <P>
            <A>
                <b>value bx</b>
                <c>value cx</c>
            </A>
            <A>
                <b>value b2x</b>
                <c>value c2x</c>
            </A>
             <D>value exw</D>
        <D>value ex2</D>

         <D>value ex2</D>
            <E>value fx</E>
        </P>
    </G>

A や D などのタグは複数回発生する可能性があります。私が作業している元の xml には多数のタグがあり、それらの多くは複数回発生しています。次のように出力を生成する必要があります:
値b値c値ew値f
値b値c値e2値f
値b2値c2値ew値f
値b2値c2値e2値f
値bx値cx値exw値fx
値bx値cx 値 ex2 値 fx
値 bx 値 cx 値 ex3 値 fx
値 b2x 値 c2x 値 exw 値 fx
値 b2x 値 c2x 値 ex2 値 fx
値 b2x 値 c2x 値 ex3 値 fx

この xslt は、A タグが複数回出現する場合は正しい出力を生成しますが、上記の xml の D のような他のタグが繰り返される場合、これは機能しません。

<xsl:for-each select="//A">
    <xsl:value-of select="b"/>
    <xsl:text>,</xsl:text>
    <xsl:value-of select="c"/>
    <xsl:text>,</xsl:text>
    <xsl:value-of select="ancestor::P/D"/>
    <xsl:text>,</xsl:text>
    <xsl:value-of select="ancestor::P/E"/>
    <xsl:text>  
</xsl:text>
</xsl:for-each>

正しいxsltを提案してください

4

2 に答える 2

1

考えられる解決策は次のとおりです。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:variable name='s' select='","' />
    <xsl:template match="A">
        <xsl:variable name='b' select='b' />
        <xsl:variable name='c' select='c' />
        <xsl:for-each select="../D"><xsl:value-of select='$b' /><xsl:value-of select='$s' /><xsl:value-of select='$c' /><xsl:value-of select='$s' /><xsl:value-of select='.'/><xsl:value-of select='$s' /><xsl:value-of select='../E'/><xsl:text>
</xsl:text></xsl:for-each>
    </xsl:template>
    <xsl:template match="text()" />
</xsl:stylesheet>

すべての A を検索し、各 A に対して、A の各 D 兄弟の行を出力することに注意してください。これが必要なものであることを確認してください。

出力は次のとおりです。

value b,value c,value ew,value f
value b,value c,value e2,value f
value b2,value c2,value ew,value f
value b2,value c2,value e2,value f
value bx,value cx,value exw,value fx
value bx,value cx,value ex2,value fx
value bx,value cx,value ex2,value fx
value b2x,value c2x,value exw,value fx
value b2x,value c2x,value ex2,value fx
value b2x,value c2x,value ex2,value fx
于 2012-07-11T07:42:40.077 に答える
1

これは、テンプレートを繰り返し呼び出すことで実現できると思います。最初にAに一致するテンプレートがありますが、 b要素とc要素を出力する代わりに、 D要素に一致するテンプレートにパラメーターとして渡します。

<xsl:template match="A">
  <xsl:apply-templates select="following-sibling::D">
     <xsl:with-param name="prefix">
        <xsl:value-of select="b"/>
        <xsl:text>,</xsl:text>
        <xsl:value-of select="c"/>
     </xsl:with-param>
  </xsl:apply-templates>
</xsl:template>

次に、D要素に一致するテンプレート内で、プレフィックスを D の値と連結し、それをE要素に一致するテンプレートに渡します。

<xsl:template match="D">
  <xsl:param name="prefix"/>
  <xsl:apply-templates select="following-sibling::E">
     <xsl:with-param name="prefix">
        <xsl:value-of select="$prefix"/>
        <xsl:text>,</xsl:text>
        <xsl:value-of select="."/>
     </xsl:with-param>
  </xsl:apply-templates>
</xsl:template>

そして、E要素に一致するテンプレートは文字列全体を出力できます。ここに完全な XSLT があります

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

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

   <xsl:template match="A">
      <xsl:apply-templates select="following-sibling::D">
         <xsl:with-param name="prefix">
            <xsl:value-of select="b"/>
            <xsl:text>,</xsl:text>
            <xsl:value-of select="c"/>
         </xsl:with-param>
      </xsl:apply-templates>
   </xsl:template>

   <xsl:template match="D">
      <xsl:param name="prefix"/>
      <xsl:apply-templates select="following-sibling::E">
         <xsl:with-param name="prefix">
            <xsl:value-of select="$prefix"/>
            <xsl:text>,</xsl:text>
            <xsl:value-of select="."/>
         </xsl:with-param>
      </xsl:apply-templates>
   </xsl:template>

   <xsl:template match="E">
      <xsl:param name="prefix"/>
      <xsl:value-of select="$prefix"/>
      <xsl:text>,</xsl:text>
      <xsl:value-of select="."/>
      <xsl:value-of select="'&#13;'"/>
   </xsl:template>
</xsl:stylesheet>

XML サンプルに適用すると、以下が出力されます。

value b,value c,value ew,value f
value b,value c,value e2,value f
value b2,value c2,value ew,value f
value b2,value c2,value e2,value f
value bx,value cx,value exw,value fx
value bx,value cx,value ex2,value fx
value bx,value cx,value ex2,value fx
value b2x,value c2x,value exw,value fx
value b2x,value c2x,value ex2,value fx
value b2x,value c2x,value ex2,value fx
于 2012-07-11T07:54:43.473 に答える