2008-10-01 37 views
4

我有一些XML重複的元素,例如目的,它看起來像這樣:檢查在輸出

<root> 
    <field1>test</field1> 
    <f2>t2</f2> 
    <f2>t3</f2> 
</root> 

我想用XSLT轉換它,但我想抑制第二F2元素在輸出中 - 我如何檢查模板內部,以查看源代碼中第二個f2元素的處理過程中f2元素是否已經存在於輸出中?我的XSLT看起來是這樣的,目前:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="no" omit-xml-declaration="yes" standalone="no" /> 
    <xsl:template match="/"> 
    <xsl:for-each select="./root"> 
     <output> 
     <xsl:apply-templates />   
     </output> 
    </xsl:for-each> 
    </xsl:template> 
    <xsl:template match="*" > 
     <xsl:element name="{name(.)}"> 
     <xsl:value-of select="." /> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

我需要做某種圍繞XSL檢查:元素在模板我想,但我不知道如何來詢問輸出文件,看是否該元素已經存在。

編輯:忘了pre標籤,代碼應該現在可見!

回答

7

這取決於您想要的系統範圍。

即你只關心的是同父的子女,或在同一級別的所有元素(「堂兄弟」,如果你喜歡),或在文檔中的任意元素的元素...

在第一您可以檢查前面的兄弟軸來查看是否存在其他具有相同名稱的元素。

<xsl:if test="count(preceding-sibling::node()[name()=name(current())])=0"> 
    ... do stuff in here. 
</xsl:if> 
+0

你也可以簡單地用這個謂詞做一個模板,我會想。 – 2008-10-01 16:40:32

+0

這是完美的。是的,我只需要在同一父母內部抑制重複,我想明確地允許其他父母中的相同元素 - 這很好用,並且比使用按鍵和Muenchen方法下去的路線簡單得多! – 2008-10-02 09:09:42

1

如果只檢查(並警告重複的你),你會發現沿線的一個example here

東西:

<xsl:for-each-group select="collection(...)//@id" group-by="."> 
    <xsl:if test="count(current-group()) ne 1"> 
    <xsl:message>Id value <xsl:value-of select="current-grouping-key()"/> is 
     duplicated in files 
     <xsl:value-of select="current-group()/document-uri(/)" separator=" and 
    "/></xsl:message> 
    </xsl:if> 
</xsl:for-each-group> 

進行修改,以選擇中「所有節點根「元素。

,去除重複行,你有另一個example here

這將是這樣的:

<xsl:stylesheet> 
    <xsl:key name="xyz" match="record[x/y/z]" use="x/y/z" /> 
    <xsl:variable name="noxyzdups" select="/path/to/record[generate-id(.) = generate-id(key('xyz', x/y/z))]" /> 
... 
    <xsl:template ... > 
    <xsl:copy-of "exslt:node-set($noxyzdups)" /> 
    </xsl:template> 
</xsl:stylesheet> 

X/Y/Z是您要做出獨特的XPath表達式。它可以是concat(x,' - ',@ y,' - ',z)或任何你想要的。

現在我不確定這兩個例子可以很容易地適用於您的案例,但我只是想指出這兩個來源,以防萬一它有幫助。

1

詢問變換的輸出是不可能的。跟蹤變換的當前狀態也是不可能的(即跟蹤你在變量中發出的節點)。從根本上說,這不是XSLT的工作原理。無副作用的編程環境的成本之一是你不能做有副作用的事情。好吧。

就你而言,完成此操作的一種方法是構建一個變量,該變量包含所有可以轉換爲要僅發射一次的輸出元素的源元素的列表。然後檢查你正在轉換的每個節點對這個列表。如果它不在列表中,則發出它。如果它是列表中的第一項,則發出它。否則,不要。