2017-06-22 38 views
0

我有一個XSL有一個片段,看起來像這樣:XSL模板匹配以外的所有東西

<xsl:template match="group"> 
<xsl:element name="group"> 
<xsl:copy-of select="*"/> 
</xsl:element> 
</xsl:template> 

不過,我需要它來複制所有羣體,除了那些與typevalue「記錄」。我該怎麼做呢?我可以同時使用XSL 1.0和2.0,首選1.0。源文件包含數千個組,具有4-5個不同的類型值。我希望代碼只選擇那些沒有typevalue記錄的組。

這裏是一個應該被過濾掉一個例子組:

<group recstatus="1"> 
    <sourcedid> 
     <source>system_owner_28f57240-5e2b-44af-8e62-fbf9aa6b6165</source> 
     <id>basic_groups_69782a81-042d-4717-b9e4-18abacb306b7</id> 
    </sourcedid> 
    <grouptype> 
     <scheme>Unique</scheme> 
     <typevalue level="0">RECORD</typevalue> 
    </grouptype> 
    <description> 
     <short>Ipsum dipsum</short> 
    </description> 
    <relationship> 
     <sourcedid> 
     <source>system_owner_28f57240-5e2b-44af-8e62-fbf9aa6b6165</source> 
     <id>69782a81-042d-4717-b9e4-18abacb306b7</id> 
     </sourcedid> 
     <label>Ipsum dipsum</label> 
    </relationship> 
</group> 

所有和任何幫助,非常感謝!

+0

那麼,您希望哪個輸出用於您顯示的示例輸入? –

+0

通過選擇性地應用模板而不是通過限制匹配模式來完成此過濾會更好。否則,不匹配的'group'將由默認模板處理。 –

+0

道歉,如果我不清楚。源文件包含數千個組,具有4-5個不同的類型值。我希望代碼只選擇那些沒有typevalue記錄的組。 –

回答

1

如果使用

<xsl:template match="/*"> 
    <xsl:copy> 
    <xsl:copy-of select="//group[not(grouptype/typevalue[level = 0] = 'RECORD')]"/> 
    </xsl:copy> 
</xsl:template> 

複製不具有後代typevalueRECORD那些group元素。

或者,如果你想使用的身份轉換模板複製一切然後反轉的條件,以避免複製你想要一個空的模板

<xsl:template match="group[grouptype/typevalue[level = 0] = 'RECORD']"/> 
+0

謝謝,這似乎是個伎倆。不幸的是,xml文件還包含我需要保留的數千個元素,並且這些元素現在也被過濾掉了。 –

+0

那麼,下一次考慮展示一個簡化但完整且最小化的XML輸入示例,即XSLT,輸出您想要的結果以及用於說明問題的結果。我編輯了答案,以顯示一個替代方法,使用不復制要移除的元素的模板,它假定您還將身份轉換模板作爲起點處理剩下的代碼。 –

+0

我會的,謝謝。你修改後的答案就像一個魅力。 –

0

消除以您的問題從字面上看,最直接的因素的要求XSLT表示是有兩個模板規則:

<xsl:template match="*[everything()]" priority="10"> 
    .. 
</xsl:template> 

<xsl:template match="*[something()]" priority="20"/> 

是,規則匹配「東西」和什麼也不做,並且符合「一切」,並做了一個優先級較低的規則。

相關問題