2017-08-29 8 views
1

ノードの順序があり、指定された順序に従ってXMLのノードを並べ替える必要があります。入力はXMLファイルであり、指定されたリストに従ってノードが順序付けられたXMLファイルが出力されます。XSLTを使用してXMLのノードを並べ替える方法

XML:

<root> 
    <M node="C" home="zzz"/> 
    <X name="A"/> 
    <Z/> 
    <Y test="B"/>  
</root> 

XSLT:

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

<xsl:param name="pSortingValues" select="'Y,X,Z,M,N'"/> 
<xsl:variable name="vSortingValues" select= 
    "concat(',', $pSortingValues, ',')"/> 

    <xsl:template match="node()|@*"> 
     <xsl:copy> 
     <xsl:apply-templates select="node()|@*"> 
     <xsl:sort data-type="number" select= 
     "string-length(substring-before($vSortingValues,concat(',',name,',')))"/> 
     </xsl:apply-templates> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

受け取った出力:

<root> 
    <M node="C" home="zzz"/> 
    <X name="A"/> 
    <Z/> 
    <Y test="B"/> 
</root> 

所望の出力:

<root> 
<Y test="B"/> 
<X name="A"/> 
<Z/> 
<M node="C" home="zzz"/>   
</root> 

上記のXSLTは現在、ノードの必要な順序でソートせずにXMLを解析します:'Y,X,Z,M,N'

答えて

2

ノード名でソートしようとしていますが、式nameは "name"という要素を探しています。あなたはノード

<xsl:sort data-type="number" select="string-length(substring-before($vSortingValues,concat(',', name(),',')))"/> 

ノートの名前を取得するためにname()を使用する必要があり、今後の参考のために、あなたもここにlocal-name()を使用することができます。 name()には名前空間の接頭辞が含まれていますが、名前空間は含まれている必要がありますが、local-name()は接頭辞なしの名前を返します。

関連する問題