2017-04-27 14 views
0

私はクライアントからのフラットXMLファイルを持っています。ノードパターンマッチングのデータをグループ化する必要があります。XSLT:グループ化の問題

例えば、私はthis-

<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

XSLT 2.0を使用できる場合は、 'xsl:for-each-group group-starting-with'サンプル(https://www.w3.org/TR/xslt20/#grouping-examples)をご覧ください。 –

+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の全体の内容)を選択します。

各グループには、述語を満たすこと、(group-starting-with のために現在の要素.です)p要素)から始まります。 はhead内部で子rowを持っている必要があります。

出力に移動:各グループの内容は、開閉タグ Mygroupで囲まれています。 その間に、現在のグループ全体の内容があります。

sequencecopy-ofではありません。 効率的な理由からウェブを検索しました(ウェブで の違いを検索してください)。

+0

ヘルプValdi_Boありがとう。それは働いた..私は本当にそれが動作する方法の説明に感謝します。 – user23