2010-07-21 67 views
0

請找到2 XML的需要關閉一個節點只能在特定條件

輸入XML的

<feed xmlns:es="http://ucmservice"> 
<element> 
<es:RepositoryDetails> 
    <es:Repository Type="DatabaseRepository" /> 
     <es:ConnetionDetails> 
     <es:Param MigrationSetId="439" /> 
    </es:ConnetionDetails> 
</es:RepositoryDetails> 
<es:DocProperties> 
    <es:UniqueDocId Value="_1_15"> 
      <es:DocProperty propertyName="EmployeeName"> 
       <es:PropValues> 
        <es:PropValue>Index</es:PropValue> 
       </es:PropValues> 
      </es:DocProperty> 
      <es:DocProperty propertyName="EmployeeAddress">" + 
         <es:PropValues> 
         <es:PropValue>Gurgaon</es:PropValue> 
         </es:PropValues> 
       </es:DocProperty> 
       <es:DocProperty propertyName="Salary"> 
         <es:PropValues> 
         <es:PropValue>15000</es:PropValue> 
         </es:PropValues> 
       </es:DocProperty> 
     </es:UniqueDocId> 
    </es:DocProperties> 
</element> 

<element> 
<es:RepositoryDetails> 
    <es:Repository Type="DatabaseRepository" /> 
     <es:ConnetionDetails> 
     <es:Param MigrationSetId="439" /> 
    </es:ConnetionDetails> 
</es:RepositoryDetails> 
<es:DocProperties> 
    <es:UniqueDocId Value="_1_15"> 
      <es:DocProperty propertyName="EmployeeName"> 
       <es:PropValues> 
        <es:PropValue>Index1</es:PropValue> 
       </es:PropValues> 
      </es:DocProperty> 
      <es:DocProperty propertyName="EmployeeAddress">" + 
         <es:PropValues> 
         <es:PropValue>Delhi</es:PropValue> 
         </es:PropValues> 
       </es:DocProperty> 
       <es:DocProperty propertyName="Salary"> 
         <es:PropValues> 
         <es:PropValue>25000</es:PropValue> 
         </es:PropValues> 
       </es:DocProperty> 
     </es:UniqueDocId> 
    </es:DocProperties> 
</element> 

<element> 
<es:RepositoryDetails> 
    <es:Repository Type="Trim" /> 
     <es:ConnetionDetails> 
     <es:Param MigrationSetId="439" /> 
    </es:ConnetionDetails> 
</es:RepositoryDetails> 
<es:DocProperties> 
    <es:UniqueDocId Value="_1_15"> 
      <es:DocProperty propertyName="EmployeeName"> 
       <es:PropValues> 
        <es:PropValue>Quality</es:PropValue> 
       </es:PropValues> 
      </es:DocProperty> 
      <es:DocProperty propertyName="EmployeeAddress">" + 
         <es:PropValues> 
         <es:PropValue>Mumbai</es:PropValue> 
         </es:PropValues> 
       </es:DocProperty> 
       <es:DocProperty propertyName="Salary"> 
         <es:PropValues> 
         <es:PropValue>20000</es:PropValue> 
         </es:PropValues> 
       </es:DocProperty> 
     </es:UniqueDocId> 
    </es:DocProperties> 
</element> 

<element> 
<es:RepositoryDetails> 
    <es:Repository Type="DatabaseRepository" /> 
     <es:ConnetionDetails> 
     <es:Param MigrationSetId="439" /> 
    </es:ConnetionDetails> 
</es:RepositoryDetails> 
<es:DocProperties> 
    <es:UniqueDocId Value="_1_15"> 
      <es:DocProperty propertyName="EmployeeName"> 
       <es:PropValues> 
        <es:PropValue>Index</es:PropValue> 
       </es:PropValues> 
      </es:DocProperty> 
      <es:DocProperty propertyName="EmployeeAddress">" + 
         <es:PropValues> 
         <es:PropValue>Gurgaon</es:PropValue> 
         </es:PropValues> 
       </es:DocProperty> 
       <es:DocProperty propertyName="Salary"> 
         <es:PropValues> 
         <es:PropValue>21000</es:PropValue> 
         </es:PropValues> 
       </es:DocProperty> 
     </es:UniqueDocId> 
    </es:DocProperties> 
</element> 


<element> 
<es:RepositoryDetails> 
    <es:Repository Type="Trim" /> 
     <es:ConnetionDetails> 
     <es:Param MigrationSetId="439" /> 
    </es:ConnetionDetails> 
</es:RepositoryDetails> 
<es:DocProperties> 
    <es:UniqueDocId Value="_1_15"> 
      <es:DocProperty propertyName="EmployeeName"> 
       <es:PropValues> 
        <es:PropValue>Index1</es:PropValue> 
       </es:PropValues> 
      </es:DocProperty> 
      <es:DocProperty propertyName="EmployeeAddress">" + 
         <es:PropValues> 
         <es:PropValue>Gurgaon</es:PropValue> 
         </es:PropValues> 
       </es:DocProperty> 
       <es:DocProperty propertyName="Salary"> 
         <es:PropValues> 
         <es:PropValue>15000</es:PropValue> 
         </es:PropValues> 
       </es:DocProperty> 
     </es:UniqueDocId> 
    </es:DocProperties> 
</element></feed> 

所需的輸出XML的

<tree> 
<item level="0" name="DatabaseRepository"> 
    <item level="1" name="Index"> 
     <item level="2" name="Gurgaon"/> 
     <item level="2" name="Mumbai"/> 
    </item> 
    <item level="1" name="Index1"> 
     <item level="2" name="Delhi"/> 
    </item> 
</item> 
<item level="0" name="Trim"> 
    <item level="1" name="Quality"> 
     <item level="0" name="Mumbai"/> 
    <item level="1" name="Index1"> 
     <item level="0" name="Gurgaon"/> 
    </item> 
</item> 
</tree> 

我不知道該怎麼執行它。我在XSL和Javascript中嘗試了一些東西,但它們還不夠。

+0

你的目標不明確。在你的文章中添加一些輸入和所需的輸出示例。 – 2010-07-21 15:43:03

回答

2

XSLT約爲,而不是標籤。如果您的輸出方法不是text,則不能生成非格式樹。這是一個功能!

我確定您可以用適當的XSLT生成您想要的輸出。您需要發佈輸入樣本和期望的輸出。

編輯:另外,爲了幫助你,你一定要回復這句話:

「我想結束一個節點只有一個 poarticular條件爲真」

爲:我想添加一些模板,如果一個特定的條件爲真

EDIT 2:現在使用輸入和輸出,它看起來像你想通過兩個鍵組合。所以,這個樣式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:es="http://ucmservice" exclude-result-prefixes="es"> 
    <xsl:key name="ByType" match="element" use="es:RepositoryDetails/es:Repository/@Type"/> 
    <xsl:key name="ByType-Name" match="es:UniqueDocId" use="concat(../../es:RepositoryDetails/es:Repository/@Type,'++',es:DocProperty[@propertyName='EmployeeName']/es:PropValues/es:PropValue)"/> 
    <xsl:template match="text()"/> 
    <xsl:template match="feed"> 
     <tree> 
      <xsl:apply-templates/> 
     </tree> 
    </xsl:template> 
    <xsl:template match="element"/> 
    <xsl:template match="element[count(.|key('ByType',es:RepositoryDetails/es:Repository/@Type)[1])=1]"> 
     <item level="0" name="{es:RepositoryDetails/es:Repository/@Type}"> 
      <xsl:apply-templates select="key('ByType',es:RepositoryDetails/es:Repository/@Type)/*"/> 
     </item> 
    </xsl:template> 
    <xsl:template match="es:UniqueDocId"/> 
    <xsl:template match="es:UniqueDocId[count(.|key('ByType-Name',concat(../../es:RepositoryDetails/es:Repository/@Type,'++',es:DocProperty[@propertyName='EmployeeName']/es:PropValues/es:PropValue))[1])=1]"> 
     <item level="1" name="{es:DocProperty[@propertyName='EmployeeName']/es:PropValues/es:PropValue}"> 
      <xsl:apply-templates select="key('ByType-Name',concat(../../es:RepositoryDetails/es:Repository/@Type,'++',es:DocProperty[@propertyName='EmployeeName']/es:PropValues/es:PropValue))/*"/> 
     </item> 
    </xsl:template> 
    <xsl:template match="es:DocProperty[@propertyName='EmployeeAddress']/es:PropValues/es:PropValue"> 
     <item level="2" name="{.}" /> 
    </xsl:template> 
</xsl:stylesheet> 

輸出:

<tree> 
    <item level="0" name="DatabaseRepository"> 
     <item level="1" name="Index"> 
      <item level="2" name="Gurgaon" /> 
      <item level="2" name="Gurgaon" /> 
     </item> 
     <item level="1" name="Index1"> 
      <item level="2" name="Delhi" /> 
     </item> 
    </item> 
    <item level="0" name="Trim"> 
     <item level="1" name="Quality"> 
      <item level="2" name="Mumbai" /> 
     </item> 
     <item level="1" name="Index1"> 
      <item level="2" name="Gurgaon" /> 
     </item> 
    </item> 
</tree> 

注意:你期望的輸出有一些錯誤(沒有DatabaseRepository指數 - 孟買),所以我不能,如果你真的告訴想要項目[@名稱='修剪']與@leve 2或0,因爲它寫的孫子。

+0

我編輯了這個問題,現在輸入樣本和所需的輸出在那裏。我可能使用了一些錯誤的術語,對此我表示歉意。 – user396503 2010-07-22 10:30:42

+0

令人驚歎......這就是我所需要的。 還有一件事..你從哪裏學習XSL的這個級別.. :) 我已經嘗試了這麼多的教程和書籍,所有的時間,我結束了一些一般的基本概念。這個XSL中的很多術語是我第一次遇到。我甚至無法想象創建這樣的XSL。 非常感謝亞歷杭德羅。 – user396503 2010-07-23 06:18:53

+0

@himit:我很高興這很有幫助。如果你接受這個答案,它也可以幫助其他人。關於學習XSLT,我不是一個權威,而是一個熱情的人。首先,你需要理解聲明範式:通過聲明將輸入和輸出綁定,所以沒有必要的過程,而是一個關係描述。因此,您需要研究XSLT和XPath規範,並練習好的XSLT示例,例如此處的www.dpawson.co.uk和專家站點的常見問題(例如,查看來自此處的最佳XSLT響應者的博客和站點) – 2010-07-23 12:36:29