XSLT-进入第一个子节点然后通过它的子节点和输出属性名称循环

时间:2016-01-29 13:53:22

标签: xml xslt

我是XSLT的新手。我试图将xml数据转换为制表符分隔的文本文件。我非常感谢你的帮助。

XML数据:

<?xml version="1.0" encoding="UTF-8" ?>
<xml_extract version="V1.2">
    <tables>
        <table name="TAB_1">
            <row>
                <columns>
                    <column name="ID" type="-5">1001410</column>
                    <column name="EXT_ID" type="-5">1001410</column>
                    <column name="LANG" type="12">en</column>
                    <column name="NAME" type="12">B10060601</column>
                </columns>
            </row>
            <row>
                <columns>
                    <column name="ID" type="-5">1001412</column>
                    <column name="EXT_ID" type="-5">1001412</column>
                    <column name="LANG" type="12">en</column>
                    <column name="NAME" type="12">B10141005</column>
                </columns>
            </row>
            <row>
                <columns>
                    <column name="ID" type="-5">1001414</column>
                    <column name="EXT_ID" type="-5">1001414</column>
                    <column name="LANG" type="12">en</column>
                    <column name="NAME" type="12">B10438001</column>
                </columns>
            </row>
        </table>
    </tables>
</xml_extract>

在XSLT转换之后,我想在制表符分隔的TEXT(不是XML)中输出以下内容:

ID  EXT_ID  LANG    NAME
1001410 1001410 en  B10060601
1001412 1001412 en  B10141005
1001414 1001414 en  B10438001

提前致谢,

困难的部分是输出列标题。除了硬编码列标题,我在下面尝试过。

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="/">
        <!-- Headers -->
        <xsl:for-each select="//columns[1]/column">
            <xsl:value-of select="@name"/>
            <xsl:text>&#x9;</xsl:text> <!-- tab delimited -->
        </xsl:for-each>
        <xsl:text>&#x0A;</xsl:text> <!-- new line -->
        <!-- Data -->
        <xsl:for-each select="//columns/column">
            <xsl:value-of select="."/>
            <xsl:choose>
                <xsl:when test="not(@name='NAME')">
                    <xsl:text>&#x9;</xsl:text> <!-- tab delimited -->
                </xsl:when>
                <xsl:when test="@name='NAME'">
                    <xsl:text>&#x0A;</xsl:text> <!-- new line -->
                </xsl:when>
            </xsl:choose>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

结果:

ID  EXT_ID  LANG    NAME    ID  EXT_ID  LANG    NAME    ID  EXT_ID  LANG    NAME    
1001410 1001410 en  B10060601
1001412 1001412 en  B10141005
1001414 1001414 en  B10438001

1 个答案:

答案 0 :(得分:1)

您需要将xsl:for-each更改为此选项以获取列标题

<xsl:for-each select="(//columns)[1]/column">

您之前的表达式实际上是在每个父元素下首次出现columns。也就是说,对于每个row元素,它将获得它之前的第一个columns元素。