来自xsltproc - libXML的意外结果

时间:2013-08-28 13:06:52

标签: xslt xslt-1.0 libxslt

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

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

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

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

在第二个键中,我尝试获取所有DapaPage元素,这些元素是“不是第一个兄弟姐妹”,对于给定的记录/ ID,由“兄弟姐妹的第一个”的generate-id()索引记录/ 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错误?

1 个答案:

答案 0 :(得分:1)

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