合并XSLT

时间:2017-06-03 14:47:07

标签: xml xslt xslt-1.0 xslt-2.0 xslt-grouping

如果属性值匹配,我一直在尝试合并books.xml中的所有文本节点。这些值应由任何分隔符(EX:等等)分开。

这是源XML:

<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications 
      with XML.</description>
   </book>
   <book id="bk102">
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-12-16</publish_date>
      <description>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.</description>
   </book>
   <book id="bk103">
      <author>Corets, Eva</author>
      <title>Maeve Ascendant</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-11-17</publish_date>
      <description>After the collapse of a nanotechnology 
      society in England, the young survivors lay the 
      foundation for a new society.</description>
   </book>
   <book id="bk101">
      <author>Corets, Eva</author>
      <title>Oberon's Legacy</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2001-03-10</publish_date>
      <description>In post-apocalypse England, the mysterious 
      agent known only as Oberon helps to create a new life 
      for the inhabitants of London. Sequel to Maeve 
      Ascendant.</description>
   </book>
   <book id="bk102">
      <author>Corets, Eva</author>
      <title>The Sundered Grail</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2001-09-10</publish_date>
      <description>The two daughters of Maeve, half-sisters, 
      battle one another for control of England. Sequel to 
      Oberon's Legacy.</description>
   </book>
   <book id="bk101">
      <author>Galos, Mike</author>
      <title>Visual Studio 7: A Comprehensive Guide</title>
      <genre>Computer</genre>
      <price>49.95</price>
      <publish_date>2001-04-16</publish_date>
      <description>Microsoft Visual Studio 7 is explored in depth,
      looking at how Visual Basic, Visual C++, C#, and ASP+ are 
      integrated into a comprehensive development 
      environment.</description>
   </book>
</catalog>

这是所需的输出:

<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew  Galos, Mike  Corets, Eva</author>
      <title>XML Developer's Guide  Visual Studio 7: A Comprehensive Guide  Oberon's Legacy</title>
      <genre>Computer  Computer</genre>
      <price>44.95  49.95  5.95</price>
      <publish_date>2000-10-01  2001-04-16  2001-03-10</publish_date>
      <description>An in-depth look at creating applications 
      with XML. Microsoft Visual Studio 7 is explored in depth,
      looking at how Visual Basic, Visual C++, C#, and ASP+ are 
      integrated into a comprehensive development 
      environment.  In post-apocalypse England, the mysterious 
      agent known only as Oberon helps to create a new life 
      for the inhabitants of London. Sequel to Maeve 
      Ascendant.</description>
   <book id="bk102">
      <author>Ralls, Kim  Corets, Eva</author>
      <title>Midnight Rain  The Sundered Grail</title>
      <genre>Fantasy  Fantasy</genre>
      <price>5.95  5.95</price>
      <publish_date>2000-12-16  2001-09-10</publish_date>
      <description>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.  The two daughters of Maeve, half-sisters, 
      battle one another for control of England. Sequel to 
      Oberon's Legacy.</description>
   </book>
   <book id="bk103">
      <author>Corets, Eva</author>
      <title>Maeve Ascendant</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-11-17</publish_date>
      <description>After the collapse of a nanotechnology 
      society in England, the young survivors lay the 
      foundation for a new society.</description>
   </book>
</catalog>

这是我一直在尝试的XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:key name="Dbook" match="book" use="@id"/>

    <xsl:template match="/catalog">
       <xsl:copy>
        <xsl:for-each select="book[count(. | key('Dbook', @id)[1])=1]">
            <xsl:copy>
             <xsl:copy-of select="@*"/>
               <xsl:for-each select="key('Dbook',@id)">               
                   <xsl:variable name="author" select="author"/>
                   <xsl:variable name="title" select="title"/>
                   <xsl:variable name="genre" select="genre"/>
                   <xsl:variable name="price" select="price"/>
                   <xsl:variable name="publish_date" select="publish_date"/>
                   <xsl:variable name="description" select="description"/>
                   <xsl:variable name="null"/>

                   <xsl:copy-of select="concat($author,$null)"/>
                   <xsl:copy-of select="concat($title,$null)"/>
                   <xsl:copy-of select="concat($genre,$null)"/>
                   <xsl:copy-of select="concat($price,$null)"/>
                   <xsl:copy-of select="concat($publish_date,$null)"/>
                   <xsl:copy-of select="concat($description,$null)"/>

               </xsl:for-each>
            </xsl:copy>
        </xsl:for-each>
       </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

1 个答案:

答案 0 :(得分:1)

XSLT 1.0中的简单(即使是单调乏味)解决方案如下所示:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="Dbook" match="book" use="@id"/>
<xsl:variable name="separator" select="' &amp; '" />

<xsl:template match="/catalog">
    <xsl:copy>
        <xsl:for-each select="book[count(. | key('Dbook', @id)[1])=1]">
            <xsl:copy>
                <xsl:copy-of select="@*"/>
                <xsl:variable name="group" select="key('Dbook', @id)" />
                <author>
                    <xsl:for-each select="$group">
                        <xsl:value-of select="author"/>
                        <xsl:if test="position()!=last()">
                            <xsl:value-of select="$separator"/> 
                        </xsl:if>
                    </xsl:for-each>
                </author>
                <title>
                    <xsl:for-each select="$group">
                        <xsl:value-of select="title"/>
                        <xsl:if test="position()!=last()">
                            <xsl:value-of select="$separator"/> 
                        </xsl:if>
                    </xsl:for-each>
                </title>

                <!-- add more child elements here -->

            </xsl:copy>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

<强>结果

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
  <book id="bk101">
    <author>Gambardella, Matthew &amp; Corets, Eva &amp; Galos, Mike</author>
    <title>XML Developer's Guide &amp; Oberon's Legacy &amp; Visual Studio 7: A Comprehensive Guide</title>
  </book>
  <book id="bk102">
    <author>Ralls, Kim &amp; Corets, Eva</author>
    <title>Midnight Rain &amp; The Sundered Grail</title>
  </book>
  <book id="bk103">
    <author>Corets, Eva</author>
    <title>Maeve Ascendant</title>
  </book>
</catalog>

为了消除书籍的每个子属性的重复代码,您可以定义另一个键并按如下方式使用它:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="Dbook" match="book" use="@id"/>
<xsl:key name="book-property" match="book/*" use="concat(../@id, '|', name())"/>

<xsl:variable name="separator" select="' &amp; '" />

<xsl:template match="/catalog">
    <xsl:copy>
        <xsl:for-each select="book[count(. | key('Dbook', @id)[1])=1]">
            <xsl:copy>
                <xsl:copy-of select="@*"/>
                <xsl:for-each select="*">
                    <xsl:copy>
                        <xsl:for-each select="key('book-property', concat(../@id, '|', name()))">
                            <xsl:value-of select="."/>
                            <xsl:if test="position()!=last()">
                                <xsl:value-of select="$separator"/> 
                            </xsl:if>
                        </xsl:for-each>
                    </xsl:copy>
                </xsl:for-each>             
            </xsl:copy>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

<强>结果

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
  <book id="bk101">
    <author>Gambardella, Matthew &amp; Corets, Eva &amp; Galos, Mike</author>
    <title>XML Developer's Guide &amp; Oberon's Legacy &amp; Visual Studio 7: A Comprehensive Guide</title>
    <genre>Computer &amp; Fantasy &amp; Computer</genre>
    <price>44.95 &amp; 5.95 &amp; 49.95</price>
    <publish_date>2000-10-01 &amp; 2001-03-10 &amp; 2001-04-16</publish_date>
    <description>An in-depth look at creating applications 
      with XML. &amp; In post-apocalypse England, the mysterious 
      agent known only as Oberon helps to create a new life 
      for the inhabitants of London. Sequel to Maeve 
      Ascendant. &amp; Microsoft Visual Studio 7 is explored in depth,
      looking at how Visual Basic, Visual C++, C#, and ASP+ are 
      integrated into a comprehensive development 
      environment.</description>
  </book>
  <book id="bk102">
    <author>Ralls, Kim &amp; Corets, Eva</author>
    <title>Midnight Rain &amp; The Sundered Grail</title>
    <genre>Fantasy &amp; Fantasy</genre>
    <price>5.95 &amp; 5.95</price>
    <publish_date>2000-12-16 &amp; 2001-09-10</publish_date>
    <description>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world. &amp; The two daughters of Maeve, half-sisters, 
      battle one another for control of England. Sequel to 
      Oberon's Legacy.</description>
  </book>
  <book id="bk103">
    <author>Corets, Eva</author>
    <title>Maeve Ascendant</title>
    <genre>Fantasy</genre>
    <price>5.95</price>
    <publish_date>2000-11-17</publish_date>
    <description>After the collapse of a nanotechnology 
      society in England, the young survivors lay the 
      foundation for a new society.</description>
  </book>
</catalog>