2014-05-13 61 views
0

我試圖獲取外部文檔的節點值,但無法獲取任何可用的東西。XSL 1.0如何從外部獲取文檔

這是這是文件被轉化companys.xml

<INVENTORY> 
    <PRODUCTS> 
    <ITEMS> 
      <ITEM TYPE="Toys">111111</ITEM> 
    </ITEMS> 
</PRODUCTS> 
    <PRODUCTS> 
    <ITEMS> 
      <ITEM TYPE="Toys">222222</ITEM> 
    </ITEMS> 
</PRODUCTS> 
<INVENTORY> 

這是xsl代碼products.xml

<TESTS> 
<CHILD> 
    <KEY>111111</KEY> 
    <PRODUCT>Toy 1</PRODUCT> 
    </CHILD> 
    <CHILD> 
    <KEY>222222</KEY> 
    <PRODUCT>Toy 2</PRODUCT> 
    </CHILD> 
</TESTS> 

<xsl:variable name="lookupDoc" select="document('products.xml')" /> 
<xsl:key name="product-lookup" match="KEY" use="."/> 

<xsl:template match="PRODUCT_HTML"> 
<xsl:value-of select="./@TYPE"/> <xsl:value-of select="."/> <xsl:value-of select="$lookupDoc/exam-lookup" /> 
</xsl:template> 

我是什麼從這得到是

Toys 111111 

我想要得到的是

Toys 111111 Toy 1 

你能幫我嗎?

謝謝,

亞歷

回答

1

xsl:key元件必須與key()功能結合使用。

你的鍵定義

<xsl:key name="product-lookup" match="KEY" use="."/> 

是不太你想要什麼,我想。 match控制要返回的元素,而use指示查找中匹配的表達式。如書面所示,它將返回KEY元素本身,並且您將不得不側向遍歷PRODUCT。它可能應該是

<xsl:key name="product-lookup" match="CHILD" use="KEY"/> 

這樣一來,像

<xsl:value-of select="key('product-lookup', '111111') /> 

表達式將指向在products.xml文件中的第一CHILD節點。然後,您可以向下遍歷產品名稱。

然而,有使用上的外部文檔key()功能時是在XSLT 1.0皺紋:key()的「上下文文件」操作,因此,如果當前節點是輸入文檔companys.xml中,查找不會給你想要的結果。

要解決這個問題,你可以設置上下文到目標文件,內容如下:

<xsl:variable name="key" select="." /> 
<xsl:variable name="child"> 
    <xsl:for-each select="$lookupDoc"> 
     <xsl:value-of select="key('product-lookup', $key)/PRODUCT"/> 
    </xsl:for-each> 
</xsl:variable> 

現在$child現在包含相應CHILDPRODUCT元素的字符串值。 (請參閱註釋re可變綁定。)

請注意,需要一個額外變量來存儲密鑰,以便.在更改上下文時不會更改其含義。換句話說,您必須首先保存來自原始文檔的關鍵值的綁定。

在XSLT 2.0中,可以通過使用添加到該key()功能用於設置文檔的上下文的第三參數避免一些是:

<xsl:variable name="child" select="key('product-lookup', ., $lookupDoc)" /> 

使此(共同)的問題更清潔。

+0

非常感謝您的幫助!我很親密。當我使用時​​,它會打印玩具111111111111玩具1,所以它抓住了KEY和PRODUCT。當我執行時,出現XSL tarnsformation錯誤「無法在XPath表達式中使用結果樹fragmentError,無法使用結果樹片段」。如果我只能打印相應PRODUCT節點的玩具1值,我就會被設置。 – AlexScript

+1

@AlexScript,我的錯誤。這與XSLT中的隱式類型轉換有關。一個直接綁定到節點的變量(比如'select')會給你一個節點引用,你可以在以後的XPath表達式中使用它。但是當你使用'value-of'時,它將結果轉換爲一個字符串。你有幾個選擇。如果你想要的只是產品名稱,你可以直接在'key()'表達式的'/ PRODUCT'上完成(見編輯)。或者,你可以在'for-each'內進行進一步的處理(如果你需要和其他的'CHILD'的其他部分一起工作,最後你可以使用'node-set'擴展名。 – harpo

+0

謝謝@harpo!你是一個巨大的幫助!!非常感謝。 – AlexScript