Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 查找元素的唯一子节点_Xslt - Fatal编程技术网

Xslt 查找元素的唯一子节点

Xslt 查找元素的唯一子节点,xslt,Xslt,需要编写一个xslt文件。以下是输入文件: <assets> <item> <child1>some text</child1> <child2>some text</child2> <child3>some text</child3> <child4>some text</child4> <

需要编写一个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>

孩子1
孩子2
孩子3
孩子4
切尔克斯
孩子气的
奇尔兹
您可以在元素名称上使用以下内容:

<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>

孩子1
孩子2
孩子3
孩子4
切尔克斯
孩子气的
奇尔兹
您可以使用此

    <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>

孩子1
孩子2
孩子3
孩子4
切尔克斯
孩子气的
奇尔兹

到目前为止,您尝试过什么?请告诉我们一些代码片段Stack Overflow不是一个代码编写服务,您应该尝试自己编写代码。我建议您对您的问题进行一些研究(可能尝试页面顶部的搜索框),并尝试自己编写一些代码。如果/当您在代码中遇到任何问题,请再次询问并解释您尝试了什么,以及为什么它不适合您。请参阅,以获得有关提问的帮助。