帮助合并相邻节点

问题描述

| 抱歉,我对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时。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...