0

当我们遇到这个问题时,我正在帮助另一个用户。

我有这段 XSLT,我尝试在其中创建两个键,一个是第一次出现(在同一个父级中)的元素在后代中包含给定值,第二个是在后代中所有其他出现的相同值的元素. (抱歉英语不好)

这是第一个键,其目标是为给定的 Record/ID 创建一个具有“第一个兄弟姐妹”的集合,由其 generate-id() 值索引:

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

在第二个键中,我尝试获取“不是第一个兄弟姐妹”的所有 DapaPage 元素,对于给定的 Record/ID,由具有相同 Record/ID 的“第一个兄弟姐妹”的 generate-id() 索引:

  <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 bug?

4

1 回答 1

1

很难确定,但是是的,这看起来像是 xsltproc 中的一个错误。至少,我在您的关键构造函数中没有看到任何错误,并且 Saxon 9.4.0.3 同意 Xalan 而不是 xsltproc 的输出。

于 2013-08-28T15:22:31.633 回答