我有一些看起来像这样的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>
</xsl:text>
</xsl:template>
<xsl:strip-space elements="*"/>
<xsl:output omit-xml-declaration="yes" indent="yes" />
</xsl:stylesheet>
我不知道如何遍历AddressList并将其放入单个字段中。我也想忽略ListB。
我确定这是基本的东西,但我不知道xslt和我读过的所有东西似乎都有一定的知识...而且我找不到快速的初学者这本指南足以解决这个问题。
答案 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> </xsl:text>
</xsl:template>
</xsl:stylesheet>
生产:
Name1|ID1|City1;City2
Name2|ID2|City3