2017-09-06 16 views
-1

2つのノードにノードのHTML段落を分割し、以下のように2つのノードに分割したい:XMLの上XSLTは、私は、XMLノード以下のいるHTML

<root> 
 
    <story> 
 
     <p>Headlines:<br/>1- First news headline<br/>2- Second news headline<br/> 
 
     <br/> 
 
     <br/>-------Complete story-----<br/>1- First news headline story<br/> 
 
     <br/>Some detailed news story will apprear related to first headline<br/> 
 
     <br/> 
 
     <br/>2- Second news headline story<br/> 
 
     <br/>Some details about second news story will be inserted here<br/> 
 
     </p> 
 
    </story> 
 
</root>

は私の入力XMLであると第三者によって提供されているため、変更することはできません。今私はすべてのhtmlマークアップを保持して2つのノードに分割したいと思います。出力XMLは以下のようにする必要があります:

<root> 
 
<headlines> 
 
<p>Headlines:<br/>1- First news headline<br/>2- Second news headline<br/> 
 
<br/> 
 
<br/>-------</p> 
 
</headlines> 
 
<stories> 
 
<p>Complete story-----<br/>1- First news headline story<br/> 
 
<br/>Some detailed news story will apprear related to first headline<br/> 
 
<br/> 
 
<br/>2- Second news headline story<br/> 
 
<br/>Some details about second news story will be inserted here<br/> 
 
</p> 
 
</stories> 
 
</root>

あなたは、元の<p></p>タグが2つの段落に分割されていることを観察することがあります。それを変換することができる適切なxsltで助けてください。

+1

これまでに何を試しましたか? – zx485

答えて

0

あなたは-------完全な物語セパレータとして-----マークとすべてのことを処理したり、それを次のいずれかを選択しないで使用することができます。これは、下に見つけること

/root/story/p[1]/text()[. = '-------Complete story-----']/preceding::node() 

をroot-> story->最初に "------- Complete story -----"を含むテキストノードを作成し、それを実行するそのレベルのすべてのノードを選択します。それはマークアップを含む完全な見出しです。

スポイラーALERT:完全なXSLTは、次のようになります。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       xmlns:fn="http://www.w3.org/2005/xpath-functions"> 

    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/"> 

     <root> 
      <headlines> 
       <p> 
        <xsl:copy-of name="headlines" select="root/story/p[1]/text()[. = '-------Complete story-----']/preceding::node()" /> 
        <br/> 
        <br/>-------</p> 
      </headlines> 
      <stories> 
       <p> 
        <xsl:copy-of name="headlines" select="root/story/p[1]/text()[. = '-------Complete story-----']/following::node()" /> 
       </p> 
      </stories> 
     </root> 
    </xsl:template> 

</xsl:stylesheet> 
0

あなたはこの処理するためのテンプレートとして)ノードを(使用することができます。

XSLT

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

    <xsl:template match="/"> 
     <root> 
      <xsl:apply-templates/> 
     </root> 
    </xsl:template> 

    <xsl:template match="node()[matches(., '^Headlines:$')]" priority="100"> 
     <headlines> 
      <p> 
       <xsl:copy-of select=".|following::node() except (following::node()[preceding::node()[matches(., '^-------Complete story-----$')] or matches(., '^-------Complete story-----$')])"/> 
      </p> 
     </headlines> 
    </xsl:template> 

    <xsl:template match="node()[matches(., '^-------Complete story-----$')]"> 
     <stories> 
      <p> 
       <xsl:copy-of select=".|following::node()"/> 
      </p> 
     </stories> 
    </xsl:template> 

    <xsl:template match="p/node()[not(matches(., '^Headlines:$|^-------Complete story-----$'))]"></xsl:template> 

</xsl:stylesheet> 

出力を

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <headlines> 
     <p>Headlines:<br/>1- First news headline<br/>2- Second news headline<br/> 
     <br/> 
     <br/> 
     </p> 
    </headlines> 
    <stories> 
     <p>-------Complete story-----<br/>1- First news headline story<br/> 
     <br/>Some detailed news story will apprear related to first headline<br/> 
     <br/> 
     <br/>2- Second news headline story<br/> 
     <br/>Some details about second news story will be inserted here<br/> 
     </p> 
    </stories> 
</root> 
関連する問題