2017-04-10 53 views
0

我是XSLT(2.0)的新手,遇到以下情況。我有XML輸入,看起來像這樣:在另一個XSLT轉換中使用結果

<root> 
    <elem name="elemName1"> 
     <subel1>value</subel1> 
     <subel1>value2</subel1> 
    </elem> 
    <elem name="elemName2"> 
     <subel1>value</subel1> 
     <subel1>value2</subel1> 
    </elem> 
    <elem name="elemName3"> 
     <subel2>value</subel2> 
     <subel2>value2</subel2> 
    </elem> 

    <referencing> 
     <something type="elemName1"/> 
    </referencing> 
    <referencing> 
     <something type="elemName2"/> 
    </referencing> 
    <referencing> 
     <something type="elemName3"/> 
    </referencing> 
</root> 

我需要兩樣東西:

  1. 改變屬性包含<subel1>elemNameXnewelemNameX
  2. 改變所有<something>type所有<elem>元素的名稱屬性來引用這些新名稱。

我已經成功地做到第一步,但我與第二

我想經歷的所有\\something\@type,並試圖找到\\elem[@name='newelemX']奮鬥。但我無法匹配在第一步創建的修改後的<elem>

是否可以匹配不同模板中的一個模板的結果?

+0

你需要比在本例中呈現之外的其他任何屬性被關注?具體而言,您是否需要提供複製您尚未描繪的任何''或''元素的屬性? –

+0

由於沒有關閉''元素,您的示例XML格式不正確。我假設你打算將這些開始標記中的一些改爲結束標記。 –

+0

是的,''還有其他我需要保留的屬性。 (在實踐中比我的例子稍微複雜一點,實際上,我創建了名爲'newelemNameX'的新元素'',並且引用'newelemNameX'中的'elemNameX',但自從我解決了這部分之後,我簡化了題)。 – Kejml

回答

0

我想經歷的所有\東西\ @type,並試圖找到 \ ELEM [@名稱= 'newelemX']。但我無法匹配 第一步創建的修改。

是否可以匹配不同模板中的一個模板的結果?

如果您已將模板評估結果賦值給變量,那麼可以(在XSLT 2.0中)。例如,可以通過將模板應用於記錄在變量中的節點序列來完成此操作。但是如果你願意允許一些邏輯重複,你就不需要遇到那種麻煩。你甚至可以在XSLT 1.0做

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <!-- Identity transform for where there is no more specific match --> 
    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*" /> 
    </xsl:copy> 
    </xsl:template> 

    <!-- modified "name" attributes for certain "elem" elements -->  
    <xsl:template match="elem[subel1]/@name"> 
    <xsl:attribute name="name">new<xsl:value-of select="."/></xsl:attribute> 
    </xsl:template> 

    <!-- "type" attributes of "something" elements -->  
    <xsl:template match="something/@type"> 
    <!-- need to capture the current value for use in a test expression --> 
    <xsl:variable name="current_value" select="." /> 
    <xsl:attribute name="type"> 
     <!-- insert "new" into the value where needed (logic duplicated here) --> 
     <xsl:if test="/descendant::elem[@name=$current_value]/subel1">new</xsl:if> 
     <xsl:value-of select="."/> 
    </xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 
+0

太好了,謝謝!我沒有意識到我可以編寫''在任何更改之前匹配原始文檔,這實現了訣竅。 – Kejml

相關問題