2012-01-06 12 views
5
<merge> 
    <text> 
     <div begin="A" end="B" /> 
     <div begin="C" end="D" /> 
     <div begin="E" end="F" /> 
     <div begin="G" end="H" /> 
    </text> 
</merge> 

Iは、オーダーA、B、C、D、E、F、G、Hに、属性ノードのUNION句のセットを必要とし、これが動作します。は、XPath 1.0オーダー

ただし、各@endが各@endの前に来る場合のみ、UNION演算子はドキュメントの順序でノードを返すように指定されているためです。 (?はい)

私はここに、属性は、文書内の別の順序で表示されていても、同じ順序であるノードセットを必要とする:ある

<merge> 
    <text> 
     <div end="B" begin="A" /> 
     <div begin="C" end="D" /> 
     <div end="F" begin="E" /> 
     <div begin="G" end="H" /> 
    </text> 
</merge> 

が、私は従う要素を必要とします各要素の属性は、決定された順序(属性名で指定またはアルファベット順)に従います。

答えて

6

これは、純粋なXPathでは不可能です。まず、XMLの属性は順序付けられていません。 XML 1.0 Recommendationから:

注開始タグまたは 空要素タグの属性指定の順序は重要ではありませんことを。

XPathエンジンは、ドキュメントに表示されている順序で読み込んでいますが、仕様の点では、これは信頼できるものではありません。

第2に、XPathにはソート機能がありません。したがって、選択した後にホスト言語(XSLTや汎用PLなど)で要素を並べ替えることをお勧めします。ここで

は、XSLTの値によってそれらの属性をソートする方法は次のとおりです。私は、1つにあなたの2つの式を合併し

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:template match="/"> 
     <xsl:apply-templates 
      select="/merge/text/div/@*[name()='begin' or name()='end']"> 
      <xsl:sort select="."/> 
     </xsl:apply-templates> 
    </xsl:template> 
</xsl:stylesheet> 

注意。

編集:ドキュメント順(コメントで説明したように)で出力開始/終了のペアに、次を使用します。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="div"> 
     <xsl:value-of select="concat(@begin, @end)"/> 
    </xsl:template> 
</xsl:stylesheet> 
+0

ない私が望んでいた答えが、それでも答え。私は質問をXSLT騎手に蹴るでしょう。 – JPM

+0

@JPM - ここにXSLTソリューションを投稿できます。一分。 –

+0

これは属性値でソートされます。値がそうでない場合でも、begin-end-begin-end -...の順序が必要です。 (私の例ではABCDEFGHを使用すべきではありませんでした) – JPM