2012-07-17 66 views
1

我試圖在谷歌上尋找答案,但我得到的結果是或者如何替換字符串或替換子字符串等,但我的問題是稍有不同。是否可以替換/替換傳入的XSL數據?

說我有一個現有XSL模板,說「你好世界」,即處理「數據/記錄/記錄」,但我不能修改你好世界,所以我想創造的一個包裝模板,它會按照/修改每個記錄中的數據,然後傳遞給hello-world ...有沒有辦法做到這一點?

到目前爲止,我已經成功地創建一個能夠過濾掉重複記錄的功能,我想用新的替換裏面的「數據/記錄/ *」的所有記錄的...

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 


    <xsl:template match="/"> 
     <xsl:call-template name="get-unique-record"> 
      <xsl:with-param name="records" select="/data/records/record"/> 
     </xsl:call-template> 
    </xsl:template> 

    <!-- This function will filter out the given records and return a unique set of records --> 
    <xsl:key name="kField_ID" match="field[@name='ID']" use="."/> 
    <xsl:template name="get-unique-record"> 
     <xsl:param name="records"/> 
     <xsl:for-each select="$records"> 
      <xsl:variable name="record" select="."/> 
      <xsl:if test="$record//field[generate-id() = generate-id(key('kField_ID', .))]"> 
      <xsl:copy-of select="$record"/>   
      </xsl:if> 
     </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

現在...是有可能做這樣的事情:

<xsl:variable name="/data/records/record"> 
    <xsl:call-template name="get-unique-record"> 
     <xsl:with-param name="records" select="/data/records/record"/> 
    </xsl:call-template> 
</xsl:variable> 

編輯:@LasrH,感謝您的快速回復。有沒有辦法複製現有的「/」,然後將所有/ data/records/record替換爲已過濾的?

EDIT2:@LasrH,我創建了幾個模板來修改和重建「數據」節點。是否有可能使用節點集來將現有輸入與我的新數據「替換」爲輸入?

<xsl:variable name="data"> 
    <xsl:call-template name="rebuild-data-with-record"> 
     <xsl:with-param name="records"> 
        <xsl:copy-of select="$unique-records"></xsl:copy-of> 
        </xsl:with-param> 
    </xsl:call-template> 
</xsl:variable> 

再往我試圖使用節點設置是這樣的:

<xsl:apply-templates select="exslt:node-set($data)/data"/> 

但它看起來不像是做什麼的?有沒有拋出任何錯誤。

+0

看起來像你的意思是「模板」而不是「功能」。 – LarsH 2012-07-17 20:55:09

+0

固定,是的,我是一個C/Java程序員哈哈,只是開始研究XSL。對不起,不好的術語。更新了文字。 :) – codenamezero 2012-07-17 21:41:31

+0

沒問題...它主要很重要,因爲XSLT中也有函數,它們與模板不同。 – LarsH 2012-07-18 13:58:38

回答

1

實際上,經過大量研究和試驗後,你可以在XSL級別「替換/替換」數據!你只需要自己重建根節點,並將你的「修改後的根」(RTF轉換回節點集)傳遞給你的模板,並讓你的模板讀取它自己的數據,而不是!

我問另外一個問題在這裏,這是我的實驗獲得的一部分這個工作: Unable to cast from XRTreeFrag into XNodeSet

的想法是這樣的,你有一個與輸入數據讀取/協議模板的功能,我們很多總是讀取輸入關閉根/等等/等等/等等...而不是讀它離根,你可以在每個做到這一點/您的任何模板:

<xsl:template name="helloworld"> 
    <xsl:param name="inputRoot" select="/"/> 
    <xsl:variable name="root" select="$inputRoot"/> 
    rest of your code goes here... 

現在,全部更換你的根使用$ root/blah/blah/blah進行訪問,它將使用修改後的XSL數據!

很酷的事情是,如果你不傳遞任何輸入數據,它將假設輸入爲root! ;)

這是經過測試和工作完美無瑕。然而,我只有一個擔心,如果XSL輸入是巨大的,重建整個根可能會導致性能問題。但是我的輸入只有二十幾條記錄,並且我的情況沒有任何性能問題。

所以你可能要仔細檢查你的輸入數據是否很大。

此解決方案/方法是XSL 1.0友好的。

+0

聽起來好像你在做我所做的在我的回答中說,將XML源上游進行按摩並將其傳遞給helloworld模板。對不起,我沒有更清楚地說明。很高興你知道了! – LarsH 2012-08-03 14:45:49

1

不,在XSL中無法就地修改源文檔。但是,您可以在上游(使用單獨的XSL樣式表)處理源文檔,並將按摩文檔傳遞給調用「hello-world」模板的XSL樣式表,而不是讓它處理原始源文檔。

如果您能夠修改該樣式表,您甚至可以在包含「hello-world」的相同樣式表中執行此操作。 (但是我猜你不能修改那個樣式表,或者你可以修改「hello-world」)。

+0

謝謝LarsH,是否可以複製/但用我的修改記錄替換記錄? – codenamezero 2012-07-17 21:39:25

+0

@codenamezero:是的,如果您的意思是複製*中的記錄被替換,則可以。如果您必須使用XSLT 1.0,則更難一些,因爲模板的輸出是結果樹片段,您需要使用node-set()擴展函數將其重新轉換爲節點集以供hello-world模板使用。 (見http://www.xml.com/pub/a/2003/07/16/nodeset.html) – LarsH 2012-07-18 14:02:38

+0

我會檢查一下。我終於得到它來過濾記錄,我能夠用我的過濾/數據替換/數據,但是我目前堅持將這些新數據傳遞給我的模板「hello-world」。一整個早上都在尋找答案,而且你的時間恰好趕到了! 是否可以通過修改後的節點設置現有輸入? (我已經用我嘗試過的新代碼更新了我的原始線程。 – codenamezero 2012-07-18 15:43:21