xslt transform将子节点组合成一个字符串

时间:2016-03-25 16:03:55

标签: xml xslt xml-parsing

我有一些看起来像这样的xml:

<Lists>
<ListA>
    <Item
        name = "Name1"
        ID = "ID1"
        shoesize = "10">
       <AddressList>
           <Enum>City1</Enum>
           <Enum>City2</Enum>
       </AddressList>
    </Item>
    <Item
        name = "Name2"
        ID = "ID2"
        shoesize = "13">
       <AddressList>
           <Enum>City3</Enum>
       </AddressList>
    </Item>
</ListA>
<ListB>
    ...
</ListB>
</Lists>

我需要一个转换,只选择ListA中的Items并为每个项目生成一行以管道分隔的文本,但也将地址展平为分号分隔的列表,如下所示:

Name1|ID1|City1;City2
Name2|ID2|City3

这是我到目前为止所做的:

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

<xsl:template match="Item"><xsl:value-of select="@name"/>|<xsl:value-of select="@ID"/>
<xsl:text>&#xa;</xsl:text>
</xsl:template>

<xsl:strip-space elements="*"/>
<xsl:output omit-xml-declaration="yes" indent="yes" />
</xsl:stylesheet>

我不知道如何遍历AddressList并将其放入单个字段中。我也想忽略ListB。

我确定这是基本的东西,但我不知道xslt和我读过的所有东西似乎都有一定的知识...而且我找不到快速的初学者这本指南足以解决这个问题。

1 个答案:

答案 0 :(得分:1)

给出格式良好的输入,例如:

<强> XML

<root>
   <ListA>
      <Item name="Name1" ID="ID1" shoesize="10">
         <AddressList>
            <Enum>City1</Enum>
            <Enum>City2</Enum>
         </AddressList>
      </Item>
      <Item name="Name2" ID="ID2" shoesize="13">
         <AddressList>
            <Enum>City3</Enum>
         </AddressList>
      </Item>
   </ListA>
   <ListB>
    ...
   </ListB>
</root>

你可以使用:

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:strip-space elements="*"/>

<xsl:template match="/root">
    <xsl:apply-templates select="ListA"/>
</xsl:template>

<xsl:template match="Item">
    <xsl:value-of select="@name"/>
    <xsl:text>|</xsl:text>
    <xsl:value-of select="@ID"/>
    <xsl:text>|</xsl:text>
    <xsl:for-each select="AddressList/Enum">
        <xsl:value-of select="." />
        <xsl:if test="position()!=last()">
            <xsl:text>;</xsl:text>
        </xsl:if>
    </xsl:for-each>
    <xsl:text>&#10;</xsl:text>
</xsl:template>

</xsl:stylesheet>

生产:

Name1|ID1|City1;City2
Name2|ID2|City3