5

XSLTでノードの属性の名前空間を指定する必要がないのはなぜですか?

例として、次のようなXMLがあるとします。

<?xml version="1.0"?>
<timeline xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns="urn:xmlsn:axpz_namespace">

<A>
   <B>
    <C key="in"> bval <\C>
    <C ind="ra"> bra <\C>
   </B>
<\A>

そして私のxslファイルヘッダーは次のようになります:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:mms="urn:xmlsn:axpz_namespace">

Cの属性のselectステートメントは次のようになります。

select="./mms:B/mms:C[@key='in']"/>
select="./mms:B/mms:C[@ind='ra']"/>

しかし、それを指定する必要があり、mms名前空間の一部である場合は、それを指定する必要がBあり、その名前空間の一部でもあるようです。つまりCkeyind

select="./mms:B/mms:C[@mms:key='in']"/>
select="./mms:B/mms:C[@mms:ind='ra']"/>

ノードの名前空間を指定する場合は、そのmms属性もそこにある必要があることは明らかですが、名前空間B内を指定する場合は、そこにもある必要があることも同様に明らかです。mmsC

これは些細な質問かもしれませんし、使用しているXSLリーダーに依存する質問かもしれませんが、さまざまなノードに名前空間を混在させることができるかどうかについて興味があったので、質問しています。たとえば、次のようになります。

select="./mms:B/othernamespace:C[@mms:key='in']"/>

私はSaxon8Bリーダーを使用していますが、この構文は使用するリーダーに依存する可能性があると思います。

4

2 に答える 2

4

要素xmlns=...のデフォルトの名前空間を設定しますが、属性の名前空間は設定しません。明示的に指定した場合にのみ、属性名に名前空間を取得します

使用するXMLAPIにまったく依存しないようにする必要があります。

「XML1.0の名前空間」から:

6.2名前空間のデフォルト

デフォルトの名前空間宣言のスコープは、それが表示される開始タグの先頭から対応する終了タグの末尾まで拡張されます。ただし、内部のデフォルトの名前空間宣言のスコープは除きます。空のタグの場合、スコープはタグ自体です。

デフォルトの名前空間宣言は、スコープ内の接頭辞のないすべての要素名に適用されます。デフォルトの名前空間宣言は、属性名に直接適用されません。接頭辞のない属性の解釈は、それらが表示される要素によって決定されます。

(エンファシスマイン。)

これは実際にはXSLTやXPathに関するものではなく、プレーンなXMLおよびXML名前空間に関するものであることに注意してください。

于 2012-11-02T21:21:12.450 に答える
1

接頭辞のない属性は、常に「名前空間なし」にあります。

そして、Jon Skeet の答えは次のようなものです。

「W3C名前空間仕様がそう言っているから」

このような設計上の決定の背後にある理由を説明しましょう

ロジックは、属性はそれが表示される要素によって完全に定義されるというものです。したがって、要素が特定の名前空間に属している場合、それらの属性がその (または他の) 名前空間に属していることを指定する必要はありません。

言い換えれば、属性はそれが属する要素によって完全に明確化されるため、要素の場合のように属性を明確化するための名前空間は必要ありません。

したがって、新しい XML ベースのボキャブラリを設計するときに、属性を名前空間に属するものとして定義するのは得策ではありません。

この常識的なルールの例外は、グローバルスコープの属性です (任意の要素に表示できます)。このような属性の例: xml:langxml:space、... など。

于 2012-11-03T03:52:42.107 に答える