2013-08-28 70 views
0

當我們遇到這個問題時,我正在幫助另一個用戶。xsltproc意外的結果 - libXML

我有這塊XSLT,我嘗試創建兩個鍵,一個是第一個出現(在同一父),一個元素包含一個給定值的後代,第二個與所有其他出現的相同價值在後代。 (對不起英語不好意思)

這是第一個關鍵,其目標是創建一個「第一兄弟姐妹」的集合,給定的Record/ID,由其generate-id()值索引:

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

在第二個關鍵我試圖讓所有DapaPage元件,其「不求第一的兄弟姐妹」,對於給定記錄/ 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的ction,還是這是一個xslproc錯誤?

回答

1

很難說肯定,但是,這看起來像在xsltproc中的錯誤。至少,我的關鍵構造函數中沒有看到任何錯誤,並且Saxon 9.4.0.3與Xalan一致,而不是與輸出上的xsltproc一致。