问题描述
|
抱歉,我对xsl不太了解,但是我有一个要转换的xml文档,但找不到适合我的示例。我想将这些位置合并为一个元素。我有以下文件:
<?xml version=\"1.0\" encoding=\"UTF-8\"?><tfs_events>
<title>Referees Events</title>
<event>
<id>256</id>
<name>SB-V,SB-JV vs McKinley HS</name>
<time_start>2011-04-12 17:00:00</time_start>
<time_end>2011-04-12 19:00:00</time_end>
<status>Active</status>
<locations>
<id>116</id>
<name>Lake Athletic Complex</name>
</locations>
</event>
<event>
<id>257</id>
<name>SB-V,SB-JV vs Jackson HS</name>
<time_start>2011-04-14 17:00:00</time_start>
<time_end>2011-04-14 19:00:00</time_end>
<status>Active</status>
<locations>
<id>116</id>
<name>Athletic Complex</name>
</locations>
<locations>
<id>6</id>
<name>HS Baseball Field</name>
</locations>
</event>
我正在尝试使它像这样:
<?xml version=\"1.0\" encoding=\"UTF-8\"?><tfs_events>
<title>Referees Events</title>
<event>
<id>256</id>
<name>SB-V,SB-JV vs McKinley HS</name>
<time_start>2011-04-12 17:00:00</time_start>
<time_end>2011-04-12 19:00:00</time_end>
<status>Active</status>
<location_name>Lake Athletic Complex</location_name>
</event>
<event>
<id>257</id>
<name>SB-V,SB-JV vs Jackson HS</name>
<time_start>2011-04-14 17:00:00</time_start>
<time_end>2011-04-14 19:00:00</time_end>
<status>Active</status>
<location_name>Athletic Complex,HS Baseball Field</location_name>
</event>
解决方法
此XSLT 1.0转换不使用模式,甚至没有一条条件指令:
<xsl:stylesheet version=\"1.0\"
xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">
<xsl:output omit-xml-declaration=\"yes\" indent=\"yes\"/>
<xsl:strip-space elements=\"*\"/>
<xsl:template match=\"node()|@*\">
<xsl:copy>
<xsl:apply-templates select=\"node()|@*\"/>
</xsl:copy>
</xsl:template>
<xsl:template match=\"locations[1]\">
<location_name>
<xsl:apply-templates select=
\"name | following-sibling::locations/name\"/>
</location_name>
</xsl:template>
<xsl:template match=\"locations\"/>
<xsl:template priority=\"5\" match=
\"locations[preceding-sibling::locations]/name\">
<xsl:value-of select=\"concat(\',\',.)\"/>
</xsl:template>
<xsl:template match=\"locations/name[1]\">
<xsl:value-of select=\".\"/>
</xsl:template>
</xsl:stylesheet>
当应用于提供的XML文档(包装在一个顶部元素中以使其格式正确)\“
<t>
<title>Referees Events</title>
<event>
<id>256</id>
<name>SB-V,SB-JV vs McKinley HS</name>
<time_start>2011-04-12 17:00:00</time_start>
<time_end>2011-04-12 19:00:00</time_end>
<status>Active</status>
<locations>
<id>116</id>
<name>Lake Athletic Complex</name>
</locations>
</event>
<event>
<id>257</id>
<name>SB-V,SB-JV vs Jackson HS</name>
<time_start>2011-04-14 17:00:00</time_start>
<time_end>2011-04-14 19:00:00</time_end>
<status>Active</status>
<locations>
<id>116</id>
<name>Athletic Complex</name>
</locations>
<locations>
<id>6</id>
<name>HS Baseball Field</name>
</locations>
</event>
</t>
所需的正确结果产生了:
<t>
<title>Referees Events</title>
<event>
<id>256</id>
<name>SB-V,SB-JV vs McKinley HS</name>
<time_start>2011-04-12 17:00:00</time_start>
<time_end>2011-04-12 19:00:00</time_end>
<status>Active</status>
<location_name>Lake Athletic Complex</location_name>
</event>
<event>
<id>257</id>
<name>SB-V,SB-JV vs Jackson HS</name>
<time_start>2011-04-14 17:00:00</time_start>
<time_end>2011-04-14 19:00:00</time_end>
<status>Active</status>
<location_name>Athletic Complex,HS Baseball Field</location_name>
</event>
</t>
,将标识转换与处理特殊情况的模板一起使用:
<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">
<xsl:template match=\"@*|node()\">
<xsl:copy>
<xsl:apply-templates select=\"@*|node()\" />
</xsl:copy>
</xsl:template>
<xsl:template match=\"event\">
<xsl:copy>
<xsl:apply-templates select=\"@*|node()[not(self::locations)]\" />
<location_name>
<xsl:apply-templates select=\"locations\" />
</location_name>
</xsl:copy>
</xsl:template>
<xsl:template match=\"locations\">
<xsl:value-of select=\"name\" />
<xsl:if test=\"position() != last()\">
<xsl:text>,</xsl:text>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
,这是一个替代方案(XSLT 2.0):
<xsl:stylesheet version=\"2.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">
<xsl:template match=\"event\">
<xsl:copy-of select=\"* except locations\"/>
<location_name>
<xsl:value-of select=\"locations/name\" separator=\",\"/>
</location_name>
</xsl:template>
</xsl:stylesheet>
,编辑:对不起,我错过了序列构造函数。
<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">
<xsl:template match=\"@*|node()\">
<xsl:copy>
<xsl:apply-templates select=\"@*|node()\" />
</xsl:copy>
</xsl:template>
<xsl:template match=\"node()\" mode=\"sequence\">
<xsl:if test=\"position()!=1\">,</xsl:if>
<xsl:value-of select=\".\"/>
</xsl:template>
<xsl:template match=\"locations\"/>
<xsl:template match=\"locations[1]\">
<location_name>
<xsl:apply-templates select=\"../locations/name\" mode=\"sequence\"/>
</location_name>
</xsl:template>
</xsl:stylesheet>
输出:
<tfs_events>
<title>Referees Events</title>
<event>
<id>256</id>
<name>SB-V,SB-JV vs McKinley HS</name>
<time_start>2011-04-12 17:00:00</time_start>
<time_end>2011-04-12 19:00:00</time_end>
<status>Active</status>
<location_name>Lake Athletic Complex</location_name>
</event>
<event>
<id>257</id>
<name>SB-V,SB-JV vs Jackson HS</name>
<time_start>2011-04-14 17:00:00</time_start>
<time_end>2011-04-14 19:00:00</time_end>
<status>Active</status>
<location_name>Athletic Complex,HS Baseball Field</location_name>
</event>
</tfs_events>
注意:拉动样式仅在需要时才执行转换,这意味着有ѭ9时。