2013-02-14 60 views
0

我正在努力解決以下問題。 希望你們任何一個人建議或指導我解決這個問題。根據xslt中的當前節點值更改以前的NODE值

我有一個低於僞xsd類型的有效載荷。

<element name=Main maxCoccurs=unbounded> 
     <complexType> 
      <element name=input1/> 
      <element name=input2/> 
      <element name=input3/> 
      <element name=input4/> 
      <element name=input5/> 
      <element name=inside/> 
       <element name=username/> 
       <element name=address/> 
     </complextype> 
    <element> 

主是一個可重複的元素。 我想檢查用戶名,如果所有節點的用戶名值不相等,那麼我需要爲第一個節點用戶名分配空白值。

我該如何在轉換中做到這一點?

我正在嘗試以下操作: 在變量中獲取firt用戶名,然後使用for-each來檢查所有用戶名。 如果它不等於....但我不能將空值分配給第一個節點,因爲我在某些地方在第n個節點的用戶名。

我在想使用一個變量來表示不匹配= true(),但是xslt無法讓我們在聲明後對變量進行更改。 所以即使這個選項被排除。

我該如何做到這一點? 幫我解決這個問題..

希望我很清楚。

乾杯 Chandru

+0

使用XSLT 1.0或XSLT 2.0? – 2013-02-14 10:18:45

+0

您已將此標記爲xslt 1.0和2.0 - 您確實需要哪一個? – 2013-02-14 10:19:04

回答

0

假設foomain元素的父元素的名稱可以使用

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

<xsl:template match="@* | node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@* , node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="foo[some $m in main satisfies $m/username != main/username]/main[1]/username"> 
    <xsl:copy/> 
</xsl:template> 

</xsl:stylesheet> 

下面是一些輸入樣本:

<root> 
    <foo> 
    <main> 
     <input1/> 
     <input2/> 
     <input3/> 
     <input4/> 
     <input5/> 
     <inside/> 
     <username>u1</username> 
     <address/> 
    </main> 
    <main> 
     <input1/> 
     <input2/> 
     <input3/> 
     <input4/> 
     <input5/> 
     <inside/> 
     <username>u1</username> 
     <address/> 
    </main> 
    <main> 
     <input1/> 
     <input2/> 
     <input3/> 
     <input4/> 
     <input5/> 
     <inside/> 
     <username>u2</username> 
     <address/> 
    </main> 
    <main> 
     <input1/> 
     <input2/> 
     <input3/> 
     <input4/> 
     <input5/> 
     <inside/> 
     <username>u1</username> 
     <address/> 
    </main> 
    </foo> 
</root> 

當樣式表應用撒克遜9.4,我得到的輸出是

<root> 
    <foo> 
    <main> 
     <input1/> 
     <input2/> 
     <input3/> 
     <input4/> 
     <input5/> 
     <inside/> 
     <username/> 
     <address/> 
    </main> 
    <main> 
     <input1/> 
     <input2/> 
     <input3/> 
     <input4/> 
     <input5/> 
     <inside/> 
     <username>u1</username> 
     <address/> 
    </main> 
    <main> 
     <input1/> 
     <input2/> 
     <input3/> 
     <input4/> 
     <input5/> 
     <inside/> 
     <username>u2</username> 
     <address/> 
    </main> 
    <main> 
     <input1/> 
     <input2/> 
     <input3/> 
     <input4/> 
     <input5/> 
     <inside/> 
     <username>u1</username> 
     <address/> 
    </main> 
    </foo> 
</root> 

,其中第一mainusername現在是空的,因爲有一個mainusername是從其他的不同。

由於答案已被接受,我有點困惑,但評論說你需要一個XSLT 1.0解決方案。我將在下面提供一個XSLT 1.0樣式表:

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

<xsl:template match="@* | node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="foo[main[username != ../main/username]]/main[1]/username"> 
    <xsl:copy/> 
</xsl:template> 

</xsl:stylesheet> 
+0

謝謝你的回覆。我現在刪除了xslt 1.0標籤。 @Martin,我覺得理解你的解決方案並不困難。跟你說再見嗎? – user2071463 2013-02-14 13:00:16

+0

你說:「我想檢查用戶名,如果所有節點的用戶名值不相等,那麼我需要爲第一個節點用戶名分配空白值」。對於使用XSLT 2.0的人來說,如果符合條件,就可以爲第一個'main'('main [1]')元素的'用戶名'孩子編寫一個模板。但是我認爲我用'not(=)'寫了錯誤的謂詞檢查。我將編輯並提供經過測試的代碼示例。 – 2013-02-14 13:51:03

+0

非常感謝Martin ......我很抱歉,因爲xslt版本是1.0而不是2.0。我試過你提供給我的解決方案,但不幸的是它沒有爲我工作.. :( – user2071463 2013-02-15 05:19:34

相關問題