2016-09-16 3 views
0

基本的にここでは、複数のXMLをXSLTを使用して参照XMLの要素の値でマージしソートする方法を説明します。複数のXMLを別のXMLから要素値でソートする

> <xsl:variable name="refXml" 
> select="document(concat(replace($refXmlTemp,'^file:',''),'/ref.xml'))"/> 
> 
> 

> <xsl:for-each select="for $x in 
> collection(string-join(($inputDir,'select=*.xml;recurse=yes;on-error=fail'),'?')) 
> return 
>       (if (matches($refXml/root/descendant-or-self::issue/id[normalize-space(.)=normalize-space($x/art/item/id)]/number,'\w+') 
> and matches($x/art/item/title,'\w+')) then saxon:discard-document($x) 
>       else())"> 

> <xsl:sort select="$refXml/root/descendant-or-self::issue/id[normalize-space(.)=/art/item/id]/following-sibling::number"/> 

上記のスニペットはすべての入力XMLをマージしましたが、ソートされませんでした。

XSLT xsl:sort関数は、現在処理中のXML内の値を指す場合にのみ有効です。

ref.xmlをソートの参照として使用するにはどうすればよいかアドバイスしてください。ここで

はref.xmlのサンプル入力です:

<root> 
<issue> 
    <id>wlu-101</id> 
    <number>1</number> 
</issue> 
<issue> 
    <id>wlu-143</id> 
    <number>2</number> 
</issue> 
<issue-group> 
    <issue> 
     <id>wlu-144</id> 
     <number>3</number> 
    </issue> 
    <issue-group> 
     <issue> 
     <id>wlu-185</id> 
     <number>4</number> 
     </issue> 
    </issue-group> 
</issue-group> 
</root> 

答えて

1

は代替使用<xsl:sort select="$refXml//issue[normalize-space(id)=current()/art/item/id]/number"/>として

<xsl:key name="ref" match="issue" use="normalize-space(id)"/> 

を定義した後

<xsl:sort select="key('ref', /art/item/id, $refXml)/number"/> 

<xsl:sort select="$refXml/root/descendant-or-self::issue/id[normalize-space(.)=/art/item/id]/following-sibling::number"/>を交換してください。

+0

Martinさん、ありがとうございましたが、あなたの提案したコードを試してみると、それは想定していた方法で並べ替えられません。 xmlに変更がないようです。 – Viin

+0

問題をソート順で処理したい最低3つまたは4つの入力ファイルに減らし、問題を示すために最小限に減らしたサンプルを表示できますか?私は、物事が失敗したXSLTコードスニペットからしか知ることができないのではないかと懸念しています。どのキーまたはパスが間違っているかを確認するためにサンプルデータを見る必要があります。 –

+0

woot!それは私の最初の試行ではうまくいかないという私のせいです。しかし、子孫は、で働くことができませんでした。数字の価値を得るためにどうやって使うことができましたか?それは可能でしょうか? – Viin

関連する問題