2017-04-27 109 views
0

我有一個是從客戶端來了一個平坦的XML文件。我需要對節點模式匹配中的數據進行分組。XSLT:分組問題

例如,我需要轉換這 -

<root> 
<p> 
    <row> 
     <head>Heading 1</head> 
    </row> 
</p> 
<p>Some Text</p> 
<p>Some Text</p> 
<p> 
    <row> 
     <head>Heading 2</head> 
    </row> 
</p> 
<p>Some Text</p> 
<p>Some Text</p> 
<p> 
    <row> 
     <head>Heading 3</head> 
    </row> </p> 
<p>Some Text</p> 
<p>Some Text</p> 
</root> 

我的要求是: 分組由圖案<P><row><head>(其中沒有文本),並添加單獨的部分到每個匹配組。

Expected output would be : 
<root> 
<Mygroup> 
    <p> 
     <row> 
      <head>Heading 1</head> 
     </row> 
    </p> 
    <p>Some Text</p> 
    <p>Some Text</p> 
</Mygroup> 
<Mygroup> 
    <p> 
     <row> 
      <head>Heading 2</head> 
     </row> 
    </p> 
    <p>Some Text</p> 
    <p>Some Text</p> 
</Mygroup> 
<Mygroup> 
    <p> 
     <row> 
      <head>Heading 3</head> 
     </row> </p> 
    <p>Some Text</p> 
    <p>Some Text</p> 
</Mygroup> 
</root> 

感謝您的幫助。

+0

查看任何'xsl:for-each-group group-starting-with'示例(https://www.w3.org/TR/xslt20/#grouping-examples)如果您可以使用XSLT 2.0 –

+2

您真的需要標記XSLT問題作爲XSLT 1.0或2.0,尤其是對於分組的問題,其中解決方案將是完全不同的。 –

回答

0

在這裏你有一個工作的例子。

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> 

    <xsl:template match="root"> 
    <xsl:copy> 
     <xsl:for-each-group select="p" group-starting-with=".[row/head]"> 
     <Mygroup> 
      <xsl:sequence select="current-group()"/> 
     </Mygroup> 
     </xsl:for-each-group> 
    </xsl:copy> 
    </xsl:template> 
</xsl:transform> 

for-each-group選擇所有p要素(root的全部內容), 將它們分爲組。

每個組從p元件(其爲group-starting-with 是當前元素.)),滿足謂詞開始: 必須有一個孩子rowhead內部。

現在轉到輸出:每個組的內容都包含 Mygroup開始和結束標記。 他們之間有整個當前組的內容。

請注意,我用sequencecopy-of。 我這樣做是出於效率的考慮(在網絡上搜索 它們之間的差異)。

+0

感謝您的幫助Valdi_Bo。它的工作..我真的很感激它如何工作的解釋。 – user23