2012-07-09 48 views
3

我有兩個輸出XML數據的函數。理想情況下,我想將每個函數的輸出合併爲一個變量來解析數據。XSLT - 用於組合兩個函數的內部連接類型命令

在SQL術語中,每個函數都可以通過內部連接通過屬性PageId連接在一起...但在XSLT中不允許連接(或者至少據我所知)。

關於組合這些功能的最簡單/最簡單方法的任何建議?我正在調用的函數內置於cms中,無法編輯。

一些詳細信息:

第一個功能是地圖。它列出了網站的網頁ID及其級別。

第二個函數將我需要的網頁ID及其元數據標籤與網站地圖結合在一起。

我想過爲第二個函數Page Ids創建變量,但包含元數據標籤的頁面數量發生了變化,我不認爲這些變量支持動態名稱。

我很抱歉,如果我不夠清楚,因爲xslt對我來說是新的。請讓我知道是否需要更多信息。

編輯:添加代碼示例

<in:inputs xmlns:in="http://www.composite.net/ns/transformation/input/1.0"> 
    <in:result name="SitemapXml"> 
    <Page Id="a0a47ce1-6eba-4d29-a7a3-3749c768c7e7" isopen="true" xmlns=""> 
     <Page Id="a3055286-0e90-4b04-99dd-fb1a61dde0bf" isopen='true' xmlns=""> 
     <Page Id="da675b13-d4d3-42ab-acc1-82e2a5408100" isopen='true' iscurrent='true' Depth="2"/> 
     </Page> 
    </Page> 
    </in:result> 
    <in:result name="GetisrootXml"> 
    <isroot PageId="a0a47ce1-6eba-4d29-a7a3-3749c768c7e7" Id="f8d4eea4-7070-4bc3-a804-e106697ffaa9" isroot="true" xmlns=""/> 
    <isroot PageId="f8e4adbc-2758-42d6-bc40-0192ba0107a6" Id="db62e132-3f3b-493f-917a-9e090f887f13" isroot="false" xmlns=""/> 
    </in:result> 
</in:inputs> 

我想返回:

<in:inputs xmlns:in="http://www.composite.net/ns/transformation/input/1.0"> 
    <in:result name="SitemapXml"> 
    <Page Id="a0a47ce1-6eba-4d29-a7a3-3749c768c7e7" isopen="true" xmlns="" isroot='true'> 
    </Page> 
    <Page Id="a3055286-0e90-4b04-99dd-fb1a61dde0bf" isopen='true' xmlns=""> 
     <Page Id="da675b13-d4d3-42ab-acc1-82e2a5408100" isopen='true' iscurrent='true' Depth="2"/> 
    </in:result> 
</in:inputs> 

由此,我想進一步改變輸出適合我的需要(添加標籤用於顯示目的) 。爲了達到這一點,isroot屬性需要附加到站點地圖。

+0

您可以使用XSLT 2.0,還是僅限於1.0? 2.0中有一些功能可以使任務更輕鬆。 – 2012-07-09 06:32:34

+0

這兩個in:result'元素是否真的嵌套,或者這是您的代碼示例中的拼寫錯誤?第二個「Page」元素在哪裏關閉? – hielsnoppe 2012-07-09 12:18:41

回答

2

這種轉變

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:in="http://www.composite.net/ns/transformation/input/1.0"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="kIsRootByPageId" match="isroot" use="@PageId"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="in:result[1]/Page"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*"/> 
    <xsl:copy-of select="key('kIsRootByPageId',@Id)/@isroot"/> 
    <xsl:apply-templates select="node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="in:result[2]"/> 
</xsl:stylesheet> 

時所提供的XML文檔應用:

<in:inputs xmlns:in="http://www.composite.net/ns/transformation/input/1.0"> 
    <in:result name="SitemapXml"> 
     <Page Id="a0a47ce1-6eba-4d29-a7a3-3749c768c7e7" isopen="true" xmlns=""></Page> 
     <Page Id="a3055286-0e90-4b04-99dd-fb1a61dde0bf" isopen='true' xmlns=""> 
      <Page Id="da675b13-d4d3-42ab-acc1-82e2a5408100" isopen='true' iscurrent='true' Depth="2"/></Page> 
    </in:result> 
    <in:result name="GetisrootXml"> 
     <isroot PageId="a0a47ce1-6eba-4d29-a7a3-3749c768c7e7" Id="f8d4eea4-7070-4bc3-a804-e106697ffaa9" isroot="true" xmlns=""/> 
     <isroot PageId="f8e4adbc-2758-42d6-bc40-0192ba0107a6" Id="db62e132-3f3b-493f-917a-9e090f887f13" isroot="false" xmlns=""/> 
    </in:result> 
</in:inputs> 

產生想要的,正確的結果

<in:inputs xmlns:in="http://www.composite.net/ns/transformation/input/1.0"> 
    <in:result name="SitemapXml"> 
     <Page Id="a0a47ce1-6eba-4d29-a7a3-3749c768c7e7" isopen="true" isroot="true"/> 
     <Page Id="a3055286-0e90-4b04-99dd-fb1a61dde0bf" isopen="true"> 
     <Page Id="da675b13-d4d3-42ab-acc1-82e2a5408100" isopen="true" iscurrent="true" 
       Depth="2"/> 
     </Page> 
    </in:result> 
</in:inputs> 

說明

  1. identity rule拷貝「原樣」的每個節點指此模板被選擇用於執行。

  2. 有兩個覆蓋模板,其中第二個模板「空白」刪除第二個發生的in:result

  3. 第一個覆蓋模板匹配in:result第一次出現的子節點的任何Page。我們使用密鑰來高效方便地找到isroot元素,該元素在其PageId屬性中引用當前的Page - 我們複製其isroot屬性。

+0

作品完美!謝謝!我不熟悉身份規則或使用密鑰,但是我會通過谷歌這些術語來充分理解函數是如何工作的。非常感謝! – user673869 2012-07-09 14:21:05

+0

@ user673869:不客氣。在我的答案中有這兩種技術的鏈接 - 特別是XSLT FAQ是XSLT問題解決方法中最好的資源之一。 – 2012-07-09 14:24:39

1

由於我在憤怒中使用SQL已經很多年了,很難用描述用SQL語言表達的解決方案來重新構建您的需求。 XSLT與SQL不同,因爲它使用分層數據模型而不是表格數據模型,這意味着像「內部連接」這樣的術語不會直接映射。但是,在XSLT中進行連接(內部和外部)肯定是可行的:通常將它們編寫爲嵌套循環。

問題的詳細答案取決於您使用的是XSLT 1.0還是2.0,以及要編寫的函數是否提供XML或原子值。通過具體的示例輸入和輸出來提出具體的問題真的更有效,以便我們可以給出具體的答案。

+0

我們將使用XSLT 1.0。這些函數提供XML數據。我在SQL中工作得很少,在XSLT函數中工作得很少,所以如果我不清楚,我很抱歉。我在原始請求中添加了一些代碼。 – user673869 2012-07-09 12:14:24