2016-09-14 9 views
0

これはxsltでも実行可能であるかどうかはわかりませんが、ここになります。 xmlを記事から別の部分に分割する必要があります。xslt:別のタグを新しいタグで囲むにはどうすればいいですか?

私はクラス名全角との最初のdivまで、すべてのXMLを取得し、クラス名狭ラップとdivの中にいることをラップする必要があります。
フルハンド divは、クラス名ワイドラップのdivでラップする必要があります。

次に、クラスナローラップを持つ新しいdivが開始され、クラスfull-widthを持つ次のdivまでのすべてのxmlがそれに入ります。等々。

これはxmlの簡略化されたバージョンです。タグには、ネストされたコンテンツと属性を含めることができます。

<p>lorem</p> 
<div>ipsum</div> 
<div class="full-width"> 
    <img src="image.jpg" /> 
</div> 
<p>lorem</p> 
<p>ipsum</p> 
<div class="full-width"> 
    <img src="image.jpg" /> 
</div> 
<div class="narrow-width"> 
    <img src="image.jpg" /> 
</div> 
<p>lorem</p> 
<div class="full-width"> 
    <img src="image.jpg" /> 
</div> 
<div class="full-width"> 
    <img src="image.jpg" /> 
</div> 
<table>ipsum</table> 
<p>lorem</p> 
<p>ipsum</p>   
<div class="narrow-width"> 
    <img src="image.jpg" /> 
</div> 

これは、私はそれを変換した後のように見える必要がある方法です:

<div class="narrow-wrap"> 
    <p>lorem</p> 
    <div>ipsum</div> 
</div> 

<div class="wide-wrap"> 
    <div class="full-width"> 
     <img src="image.jpg" /> 
    </div> 
</div> 

<div class="narrow-wrap"> 
    <p>lorem</p> 
    <p>ipsum</p> 
</div> 

<div class="wide-wrap"> 
    <div class="full-width"> 
     <img src="image.jpg" /> 
    </div> 
</div> 

<div class="wide-wrap"> 
    <div class="narrow-width"> 
     <img src="image.jpg" /> 
    </div> 
</div> 

<div class="narrow-wrap"> 
    <p>lorem</p> 
</div> 

<div class="wide-wrap"> 
    <div class="full-width"> 
     <img src="image.jpg" /> 
    </div> 
</div> 

<div class="wide-wrap"> 
    <div class="full-width"> 
     <img src="image.jpg" /> 
    </div> 
</div> 

<div class="narrow-wrap"> 
    <table>ipsum</table> 
    <p>lorem</p> 
    <p>ipsum</p>   
    <div class="narrow-width"> 
     <img src="image.jpg" /> 
    </div> 
</div> 

全幅部分のXSLは、このようなものになるだろう:

<xsl:template match="div[contains(concat(' ', @class, ' '), ' full-width ')]"> 
    <div> 
     <xsl:attribute name="class"> 
      wide-wrap 
     </xsl:attribute> 
     <xsl:copy-of select="."></xsl:copy-of> 
    </div> 
</xsl:template> 

の一部クラスの狭いラップを持つdivのブロックにある他のすべてのコンテンツをラップすることは、私にとどまらないものです。 これは可能ですか?あれば、どうですか?一例では、キーをチェックして、グループ内のそれぞれの項目をcurrent-group()を包むよう

+0

'fraidこの質問は研究努力を示していないので、私はdownvoteする必要があります。これまでに何を試しましたか? XSLTについてどれだけ知っていますか?他の潜在的に可能性の高いXML変換メソッドの代わりにXSLTを使用する必要がある理由はありますか? – Cauterite

+0

@Cauterite:あなたがしなければならない質問には、努力が不足しているため、Downvoteですが、XSLTを選択したときにOPを批判するのは不適切です:(1)OPの呼び出しであり、あなたのものではなく、(2)間違っています。 XML変換メソッド。 – kjhughes

+0

私はXSLTが必ずしも悪い選択であることを暗示するつもりはありませんでした。 – Cauterite

答えて

1

は、その後、https://www.w3.org/TR/xslt20/#grouping-examplesgroup-adjacent例を参照してくださいと<xsl:for-each-group select="*" group-adjacent="not (@class = 'full-width')">を試してみてください。そのアプローチを使用

あなたがhttp://xsltransform.net/6rewNxQでオンライン

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

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

    <xsl:template match="body"> 
     <xsl:copy> 
      <xsl:for-each-group select="*" group-adjacent="not (@class = 'full-width')"> 
       <xsl:choose> 
        <xsl:when test="current-grouping-key()"> 
         <div class="narrow-wrap"> 
          <xsl:apply-templates select="current-group()"/> 
         </div> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:apply-templates select="current-group()"/> 
        </xsl:otherwise> 
       </xsl:choose> 
      </xsl:for-each-group> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="div[contains(concat(' ', @class, ' '), ' full-width ')]"> 
     <div class="wide-wrap"> 
      <xsl:copy-of select="."></xsl:copy-of> 
     </div> 
    </xsl:template> 
</xsl:transform> 

を取得します。

+0

ありがとうございました。オンラインの例を作成するだけでなく、ドキュメントにリンクしていただきありがとうございます。優れた答え。 – Shaidar

関連する問題