2014-01-21 25 views
1

試圖瞭解next-match我在xmlplease.com找到了一個例子,但是當我自己嘗試時,我得到一個Ambiguous rule match for ...,我真的不知道是不是通過這個例子得到的。第三個模板在另外兩個之前應該如何優先?這種模糊的規則匹配不應該發生嗎?

這個例子簡直是錯的,還是我在這裏錯過了一些東西?


XSLT

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output indent="yes" /> 
    <xsl:template match="/"> 
     <PRODUCTS> 
      <xsl:apply-templates /> 
     </PRODUCTS> 
    </xsl:template> 
    <xsl:template match="product"> 
     <PRODUCT id="{@id}" price="{@price}" stock="{@stock}" /> 
    </xsl:template> 
    <xsl:template match="product[@id = 'p2']"> 
     <PRODUCT id="{@id}" price="{@price * 1.25}" stock="{@stock}" /> 
    </xsl:template> 
    <xsl:template match="product|product[@id = 'p2']"> 
     <xsl:comment> 
      <xsl:value-of select="concat(' ', @name, ' ')" /> 
     </xsl:comment> 
     <xsl:text>&#xA;</xsl:text> 
     <xsl:next-match /> 
    </xsl:template> 
</xsl:stylesheet> 

樣品輸入

<?xml version="1.0"?> 
<products> 
    <product id="p1" name="Delta" price="3250" stock="4" /> 
    <product id="p2" name="Golf" price="1000" stock="5" /> 
    <product id="p3" name="Alpha" price="1200" stock="19" /> 
</products> 

回答

1

嗯,基本上給你的XSLT你有相同的匹配模式的兩倍,你有xsl:template match="product"xsl:template match="product[@id = 'p2']",然後你必須再次請求xsl:template match="product|product[@id = 'p2']"。這樣,你所有的product輸入元素肯定會有模糊的匹配。所以我同意你的看法,一個樣式表在兩個不同的模板上有兩次相同的匹配模式,你會得到那個錯誤或者模棱兩可的警告。但是處理器可以選擇僅發出警告並採取最後一個模板。這就是撒克遜9確實例如,它說像

Recoverable error 
    XTRE0540: Ambiguous rule match for /products/product[1] 
Matches both "element(Q{}product)" on line 14 of 
    file:/C:/Users/Martin%20Honnen/Documents/xslt/test2014012101.xsl 
and "element(Q{}product)" on line 8 of 
    file:/C:/Users/Martin%20Honnen/Documents/xslt/test2014012101.xsl 
Recoverable error 
    XTRE0540: Ambiguous rule match for /products/product[2] 
Matches both "product|product[@id = 'p2']" on line 14 of 
    file:/C:/Users/Martin%20Honnen/Documents/xslt/test2014012101.xsl 
and "product[@id = 'p2']" on line 11 of 
    file:/C:/Users/Martin%20Honnen/Documents/xslt/test2014012101.xsl 
Recoverable error 
    XTRE0540: Ambiguous rule match for /products/product[3] 
Matches both "element(Q{}product)" on line 14 of 
    file:/C:/Users/Martin%20Honnen/Documents/xslt/test2014012101.xsl 
and "element(Q{}product)" on line 8 of 
    file:/C:/Users/Martin%20Honnen/Documents/xslt/test2014012101.xsl 

但隨後寫的

<PRODUCTS> 
    <!-- Delta --> 
    <PRODUCT id="p1" price="3250" stock="4"/> 
    <!-- Golf --> 
    <PRODUCT id="p2" price="1250" stock="5"/> 
    <!-- Alpha --> 
    <PRODUCT id="p3" price="1200" stock="19"/> 
</PRODUCTS> 
+0

啊,這是有道理的。所以作者使用的轉換引擎可能會這樣配置。不知道這甚至是一個選擇,嘿嘿。 – Svish

3

的XSLT輸出2.0規範說,這是一個錯誤,以具有相同的優先級兩個模板和優先級都匹配相同的節點,這就是發生在這裏。該規範給出了許多應該發生的選擇(並且Saxon具有允許您選擇各種策略的配置選項),但是如果您希望代碼具有可移植性和無錯誤性,最佳方法是使用每個規則的顯式優先級xsl:template上的優先級屬性。 (數字越大意味着優先級越高)。