2017-03-08 44 views
0

我停留在XSLT點: 我的XML是:XSLT分裂XML成組基於匹配條件

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<nums> 
    <num>02</num> 
    <num>02</num> 
    <num>03</num> 
    <num>04</num> 
    <num>05</num> 
    <num>06</num> 
    <num>06</num> 
    <num>08</num> 
    <num>09</num> 
    <num>10</num> 
</nums> 

我目前的XSLT是:

<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:param name="pGroupSize" select="3"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="/*"> 
    <nums> 
    <xsl:apply-templates select= 
     "num[position() mod $pGroupSize = 1]"/> 
    </nums> 
</xsl:template> 

<xsl:template match="num"> 
    <group> 
    <xsl:copy-of select= 
    ".|following-sibling::* 
       [not(position() > $pGroupSize -1)]"/> 
    </group> 
</xsl:template> 
</xsl:stylesheet> 

我的電流輸出: 不考慮節點值來拆分xml。

<nums> 
    <group> 
     <num>02</num> 
     <num>02</num> 
     <num>03</num> 
    </group> 
    <group> 
     <num>04</num> 
     <num>05</num> 
     <num>06</num> 
    </group> 
    <group> 
     <num>07</num> 
     <num>08</num> 
     <num>09</num> 
    </group> 
    <group> 
     <num>10</num> 
    </group> 
</nums> 

我的預期輸出XML: 首先檢查是否有任何匹配的節點到最後一個節點,如果是包括它們,否則它們排除在外。

<nums> 
    <group> 
     <num>02</num> 
     <num>02</num> 
     <num>03</num> 
    </group> 
    <group> 
     <num>04</num> 
     <num>05</num> 
     <num>06</num> 
     <num>06</num> 
    </group> 
    <group> 
     <num>08</num> 
     <num>09</num> 
     <num>10</num> 
    </group> 
</nums> 
+0

你可能想解釋稍微詳細地這一條件。你只對你的例子中所有相鄰的'06'兄弟姐妹或任何'06'兄弟姐妹感興趣嗎? –

+0

只有相鄰的06兄弟 –

回答

0

我想你可能要解決使用同級遞歸或者,如果XSLT 3.0可用時,使用xsl:iterate

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:math="http://www.w3.org/2005/xpath-functions/math" 
    exclude-result-prefixes="xs math" 
    version="3.0"> 

    <xsl:output indent="yes"/> 

    <xsl:param name="pGroupSize" as="xs:integer" select="3"/> 

    <xsl:template match="/*"> 
     <xsl:copy> 
      <xsl:iterate select="*"> 
       <xsl:param name="group" as="element()*" select="()"/> 
       <xsl:param name="last" as="element()?" select="()"/> 
       <xsl:on-completion> 
        <xsl:if test="$group"> 
         <group> 
          <xsl:copy-of select="$group"/> 
         </group> 
        </xsl:if> 
       </xsl:on-completion> 
       <xsl:if test="count($group) ge $pGroupSize and . != $last"> 
        <group> 
         <xsl:copy-of select="$group"/> 
        </group> 
       </xsl:if> 
       <xsl:next-iteration> 
        <xsl:with-param name="group" 
         select="if (count($group) ge $pGroupSize and . != $last) 
           then . 
           else ($group, .)"/> 
        <xsl:with-param name="last" 
         select="if (count($group) ge $pGroupSize and . = $last) then $last else ."/> 
       </xsl:next-iteration> 
      </xsl:iterate> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 
+0

我試着將這段代碼應用到我的XML中。它會引發錯誤。我是新來的。你能告訴我如何使用這個XSLT? –

+0

我們是否需要在這裏匹配「num」標籤? –

+0

我發佈的代碼是XSLT 3.0,因此您需要使用像Saxon 9 PE或EE這樣的XSLT 3.0處理器,如Oxygen或Stylus Studio等XML IDE中提供的,或Altova XMLSpy和Raptor中提供的代碼。也許其他人可以告訴你如何使用早期的XSLT版本和「使用兄弟遞歸」的方法來做到這一點,或者看看使用這種方法的其他解決方案,並嘗試是否可以根據您的特定需求來調整它們。 –