0

この問題に遭遇したとき、私は別のユーザーを助けていました。

私は、2 つのキーを作成しようとする XSLT のこの部分を持っています。1 つは、子孫の特定の値を含む要素の最初の出現 (同じ親) であり、2 番目のキーは、子孫の同じ値の他のすべての出現です。 . (下手な英語でごめんなさい)

これは最初のキーであり、その目的は、generate-id() 値によってインデックス付けされた特定のレコード/ID に対して、「兄弟の最初」でセットを作成することです。

  <xsl:key name ="key1" match="DataPage[not(
      preceding-sibling::DataPage/Record/ID = Record/ID
    )]"
    use="generate-id()"/>

2 番目のキーでは、同じレコード/ID を持つ「最初の兄弟」の generate-id() によってインデックス付けされた、指定されたレコード/ID について、「最初の兄弟ではない」すべての DapaPage 要素を取得しようとします。 :

  <xsl:key name="key2" match="DataPage[
      preceding-sibling::DataPage/Record/ID = Record/ID
    ]"
    use="generate-id(preceding-sibling::DataPage[
      Record/ID = current()/Record/ID
    ][last()])" />

そして、テンプレート

  <xsl:template match="/*">
      <xsl:copy>
        <xsl:apply-templates select="DataPage"/>
      </xsl:copy>
  </xsl:template>
  <xsl:template match="DataPage">
    <xsl:copy>
      <xsl:for-each select="key('key1',generate-id())">
        <Key1>
          <xsl:copy-of select="."/>
        </Key1>
      </xsl:for-each>
      <xsl:for-each select="key('key2',generate-id())">
        <Key2>
          <xsl:copy-of select="."/>
        </Key2>
      </xsl:for-each>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

この XML を使用して XSLT をテストしました。

<?xml version="1.0" encoding="UTF-8"?>
<Page>
    <DataPage>
        <Record>
            <ID>0</ID>
            <DESC>AAA</DESC>
            <AMOUNT>11</AMOUNT>
        </Record>
    </DataPage>
    <DataPage>
        <Record>
            <ID>0</ID>
            <DESC>BBB</DESC>
            <AMOUNT>22</AMOUNT>
        </Record>
    </DataPage>
    <DataPage>
        <Record>
            <ID>0</ID>
            <DESC>CCC</DESC>
            <AMOUNT>333</AMOUNT>
        </Record>
    </DataPage>
</Page>

Xalan で変換すると、予想どおり、次の結果が得られます。

<Page>
  <DataPage>
    <Key1>
      <DataPage>
        <Record>
            <ID>0</ID>
            <DESC>AAA</DESC>
            <AMOUNT>11</AMOUNT>
        </Record>
      </DataPage>
    </Key1>
    <Key2>
      <DataPage>
        <Record>
            <ID>0</ID>
            <DESC>BBB</DESC>
            <AMOUNT>22</AMOUNT>
        </Record>
      </DataPage>
    </Key2>
    <Key2>
      <DataPage>
        <Record>
            <ID>0</ID>
            <DESC>CCC</DESC>
            <AMOUNT>333</AMOUNT>
        </Record>
      </DataPage>
    </Key2>
  </DataPage>
  <DataPage/>
  <DataPage/>
</Page>

ただし、libXML xsltproc を使用すると、次のような結果しか得られません。

<Page>
  <DataPage>
    <Key1>
      <DataPage>
        <Record>
            <ID>0</ID>
            <DESC>AAA</DESC>
            <AMOUNT>11</AMOUNT>
        </Record>
      </DataPage>
    </Key1>
  </DataPage>
  <DataPage/>
  <DataPage/>
</Page>

Key2 の構造の何が問題なのですか、それとも xslproc のバグですか?

4

1 に答える 1

1

確かなことは言えませんが、そうです、これは xsltproc のエラーのようです。少なくとも、キー コンストラクターに問題は見られず、Saxon 9.4.0.3 は Xalan に同意し、出力の xsltproc には同意しません。

于 2013-08-28T15:22:31.633 に答える