2013-10-11 63 views
0

嘗試從根元素移動直接子元素,然後將它們複製到新根元素下。能夠做到一個孩子的元素,但不知道如何申請orselect聲明。
遞歸子元素當前XSLT:XSLT:應用模板時不包括多個子元素

<xsl:template match="Element1"> 
    <Information> 
     <xsl:apply-templates select="*[name()!='Element1']"/> 
    </Information> 
    <xsl:apply-templates select="Element1"/> 
    </xsl:template> 
    <xsl:template match="Element1/Element1"> 
    <Metadata> 
     <xsl:apply-templates/> 
    </Metadata> 
    </xsl:template> 

我想爲另一個孩子元素的運用相同的,並試圖

<xsl:template match="Element1"> 
    <Information> 
     <xsl:apply-templates select="*[name()!='Element1'] | *[name()!='Element2']"/> 
    </Information> 
    <xsl:apply-templates select="Element1"/> 
    </xsl:template> 
    <xsl:template match="Element1/Element1"> 
    <Metadata> 
     <xsl:apply-templates/> 
    </Metadata> 
    </xsl:template> 

    <xsl:template match="Element1/Element2"> 
    <Metadata2> 
     <xsl:apply-templates/> 
    </Metadata2> 
    </xsl:template> 

但沒有奏效。請幫忙。

回答

1

您可能想嘗試將這些模板放入組中,並使用空模板刪除那些不需要的模板。添加一個模式到應用模板

<xsl:apply-templates select="*" mode="metadata"/> 

激活組,然後將組

<xsl:template match="*" mode="metadata"/> 
<xsl:template match="Element1" mode="metadata"> 
    ... 
<xsl:template> 
<xsl:template match="Element2" mode="metadata"> 
    ... 
<xsl:template> 

用於元數據塊中定義的模板。


使用模式,模板會是這個樣子:

<xsl:template match="Element1"> 
    <Information> 
    <!-- use templates in the information group --> 
    <xsl:apply-templates select="*" mode="metadata"/> 
    </Information> 
    <xsl:apply-templates select="Element1"/> 
</xsl:template> 

<!-- This template removes unspecified elements --> 
<xsl:template match="*" mode="metadata"/> 

<xsl:template match="Element1" mode="metadata"> 
    <Metadata> 
    <xsl:apply-templates/> 
    </Metadata> 
</xsl:template> 

<xsl:template match="Element2" mode="metadata"> 
    <Metadata2> 
    <xsl:apply-templates/> 
    </Metadata2> 
</xsl:template> 

你可能有確定的<Metadata/><Metadata2/>內容其他一些模板。那些應該也可以在模式中。

+0

我在哪裏可以在問題中提到的xslt中使用group? –

+1

你的意思是'模式'嗎?我不認爲'group'是'xsl:template'或'xsl:apply-templates'上的有效屬性。 –

+0

是的,模式。爲我回答iPad上的問題提供了正確的答案,並且無需通過處理器運行。 –

0
<xsl:apply-templates select="*[name()!='Element1'] | *[name()!='Element2']"/> 

...對於Element1和Element2總是如此 - 您不能將兩個!=表達式鏈接在一起,因爲表達式對於所有內容都將評估爲true。

您可以簡單地將Element1/Element1和Element1/Element2路徑與不輸出任何內容的模板進行匹配 - 然後您不必在內部的apply-templates表達式中使用複雜的邏輯。

然後從你的根目錄調用一個命名模板(而不是使用匹配)來輸出Element1/Element1你想要的位置。

+0

對不起,代碼沒有顯示:表達式* [name()!='Element1'] | * [name()!='Element2']的所有元素名稱的計算結果均爲true。 – Agnes

+0

但它只適用於'* [name()!='Element1']',但是當我給出'* [name()!='Element1'] | * [name()!='Element2']'它包含'Element2' –

+1

因爲Element2!= Element1。所以上半場或你的表情正在評估爲真。 – Agnes