循环遍历xml并返回xml节点名称

时间:2016-06-03 13:38:14

标签: xml xslt

您好我有一个关于循环浏览xml文档的问题,并返回文档元素的子子子元素(例如prop1,prop2,item1,item2,country1,country2)及其所属的孩子(例如人,姓名,地址) )元素名称。

我有以下XML文档:

<data>
    <person>
        <properties>
            <prop1>test</prop1>
            <prop2>test</prop2>
        </properties>
    </person>
    <name>
        <properties>
            <item1>test</item1>
            <item2>test</item2>
        </properties>
    </name>
    <address>
        <properties>
            <country1>test</country1>
            <country2>test</country2>
        </properties>       
    </address>
</data>

我想要的输出是:

person prop1
person prop2
name item1
name item2
address country1
address country2

我设法生成以下列表: 人 名称 地址

应用此XSLT转换。:

<xsl:template match="*/*|@*">  
   <xsl:value-of select="name()"/>  
   <xsl:apply-templates select="@*"/>
 </xsl:template>

谁能告诉我应该怎么做?感谢

3 个答案:

答案 0 :(得分:2)

我相信你想这样做:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:template match="/data">
    <xsl:for-each select="*/properties/*">
        <xsl:value-of select="name(../..)" />
        <xsl:text> </xsl:text>
        <xsl:value-of select="name()"/>
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

答案 1 :(得分:1)

试试这个XSLT-1.0片段:

#! /bin/bash
./script&
pid=$!
sleep 10
echo $string > /proc/${pid}/fd/0

输出为:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" />

  <xsl:template match="text()" />

  <xsl:template match="/data/*">
    <xsl:for-each select="properties/*">
      <xsl:value-of select="concat(name(../..),' ',name(),'&#10;')" />
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

答案 2 :(得分:1)

简短而简单的完全拉动式转换

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>
  <xsl:strip-space elements="*"/>
  <xsl:template match="/*/*/*/*">
    <xsl:value-of select="concat(name(../..),' ',name(),'&#xA;')"/>
  </xsl:template>
</xsl:stylesheet>

注意

没有必要使用任何<xsl:for-each> - 只需让XSLT处理模型和XSLT处理器完成它们的工作。