2016-08-30 21 views
0

私はXSLTを使って解析しているXML形式のHTMLを持っています。それを解析するXSLTは、このようになります後XSLTを使用してXML属性の順序を設定しますか?

<html> 
<head> 
<meta charset="utf-8" /> 
<title>Test</title> 
</head> 
<body> 
<img height="" width="' src="google.gif?<>" /> 
</body> 
</html> 

<html> 
    <head> 
    <meta charset="utf-8" /> 
    <title>Test</title> 
    </head> 
    <body> 
    <img height="" src="google.gif?<>" width=""/> 
    </body> 
    </html> 

私は<img height="" width="" src="google.gif?<>" />よう@srcとして最後の属性をしたいが、デフォルト属性のアルファベット順にソートされている私のHTMLは次のようになります。私は<xsl:sort>を使ってそれをすることができません。 (wellformation付き)

+1

私は怖い '" /> '整形式でないXMLがすべてであるそしてもちろん、私たちはあなたのXSLTを確認する必要があり、同様にその容疑者を並べ替えるでしょう。属性。 –

+1

さらに、[属性の順序はXML勧告に従って重要ではない](http://stackoverflow.com/a/39228435/290085)。 – kjhughes

答えて

0

入力HTML

<html> 
<head> 
    <meta charset="utf-8" /> 
    <title>Test</title> 
</head> 
    <body> 
     <img height="13" width="12" src="google.gif?" id="id1"/> 
    </body> 
</html> 

XSLT:

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

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

<xsl:template match="img"> 
    <xsl:copy> 
     <xsl:for-each select="@*[not(name()='src')]"> 
      <xsl:sort select="name()"/> 
      <xsl:attribute name="{name()}"> 
       <xsl:value-of select="."/> 
      </xsl:attribute> 
     </xsl:for-each> 
     <xsl:apply-templates select="@*[name()='src']"/> 
     <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

結果:

<html> 
<head> 
    <meta charset="utf-8"/> 
    <title>Test</title> 
</head> 
<body> 
    <img height="13" id="id1" width="12" src="google.gif?"/> 
</body> 
</html> 
+0

こんにちは、私は常に最後に@srcたい <メタのcharset = "UTF-8" /> テスト として結果を求めています。 – user3287034

+0

@ user3287034、必要に応じて、kjhughesの提案として属性を任意の順序にすることができますが、他のスクリプト言語(xpathをサポートしていない)が入力XMLにアクセスしているときや、これらの属性の位置が有用な場合があります。 –

0

<img height="" width="' src="google.gif?<>" />のほかはXML Recommendationあたりcommented by Martin Honnen ...

Attribute order is insignificantとしてよく形成されていない:開始タグまたは 空要素タグの属性指定の順序ではないこと

注意重要です。

したがって、XSLTは属性の順序を制約する方法を提供しません。

アトリビュートの順序を無視するこの推奨事項を拒否する場合は、XSLT attribute orderingの先の質問Martin Honnen's suggestions regarding how to control attribute ordering outputを参照してください。

0

XSLTはXDMデータモデルに準拠した結果ツリーを出力として生成し、XDMモデルでは属性の順序は異なります。彼らは順序がないので、XSLTスタイルシート命令は順序を制御できません。

順序を制御する唯一の機会は、結果ツリーの順序付けられていない属性ノードが字句XML出力のname = "value"ペアの順序付きシーケンスに変換されるときに発生します。 XSLT(任意のバージョン)で利用可能な標準シリアル化プロパティは、これを制御する方法を提供しません。サクソンしかし、拡張属性saxon:attribute-orderている - を参照し

http://www.saxonica.com/documentation/index.html#!extensions/output-extras/serialization-parameters

関連する問題