2017-03-01 85 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>