2017-03-01 121 views
-1

需要編寫一個xslt文件。下面是輸入文件:查找元素的唯一子節點

<assets> 
    <item> 
     <child1>some text</child1> 
     <child2>some text</child2> 
     <child3>some text</child3> 
     <child4>some text</child4> 
    </item> 
    <item> 
     <child1>some text</child1> 
     <child2>some text</child2> 
     <childx>some text</childx> 
    </item> 
    <item> 
     <child1>some text</child1> 
     <childx>some text</childx> 
     <childy>some text</childy> 
     <childz>some text</childz> 
    </item> 
</assets> 

我需要找出資產/項目的所有獨特的子名稱。兒童和兒童名稱的數量是元素(項目)下的動態 輸出應該如下:

<item> 
    <columns> 
     <columnname>child1</columnname> 
     <columnname>child2</columnname> 
     <columnname>child3</columnname> 
     <columnname>child4</columnname> 
     <columnname>childx</columnname> 
     <columnname>childy</columnname> 
     <columnname>childz</columnname> 
    </columns> 
</item> 
+0

你嘗試過到現在怎麼辦?請給我們展示一些代碼片段 – Nevermore

+0

Stack Overflow不是一個代碼編寫服務,希望您自己嘗試編寫代碼。我建議你對你的問題做一些研究(也許試試頁面頂部的搜索框),並嘗試自己編寫一些代碼。如果/當您遇到任何與您的代碼有關的問題時,請再次提問並解釋您所嘗試的內容,以及爲什麼它不適合您。請參閱[如何提問](http://stackoverflow.com/help/how-to-ask)尋求幫助,提出一個很好的問題以及[最小,完整,可驗證的示例](http://stackoverflow.com/幫助/ MCVE)。 – bc004346

回答

1

您可以使用Muenchian grouping的元素名稱 - 這樣的事情:

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

    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/> 

    <xsl:key name="elements" match="*" use="local-name()" /> 

    <xsl:template match="/"> 
     <item> 
      <xsl:apply-templates select="assets/item" /> 
     </item> 
    </xsl:template> 

    <xsl:template match="item"> 
     <xsl:for-each select="*[count(.|key('elements', local-name())[1]) = 1]"> 
      <columnname> 
       <xsl:value-of select="name()"/> 
      </columnname> 
     </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

將讓你這樣的:

<item> 
    <columnname>child1</columnname> 
    <columnname>child2</columnname> 
    <columnname>child3</columnname> 
    <columnname>child4</columnname> 
    <columnname>childx</columnname> 
    <columnname>childy</columnname> 
    <columnname>childz</columnname> 
</item> 
0

您可以使用此

<xsl:key name="child" match="item/*" use="name()"/> 

<xsl:template match="/"> 
    <item> 
     <columns> 
      <xsl:for-each select="//item/*[count(.|key('child', name())[1]) = 1]"> 
       <columnname><xsl:value-of select="name()"/></columnname>      
      </xsl:for-each> 
     </columns> 
    </item> 
</xsl:template> 

輸出

<item> 
     <columns> 
      <columnname>child1</columnname> 
      <columnname>child2</columnname> 
      <columnname>child3</columnname> 
      <columnname>child4</columnname> 
      <columnname>childx</columnname> 
      <columnname>childy</columnname> 
      <columnname>childz</columnname> 
     </columns> 
    </item>