2017-02-14 5 views
0

私は以下のようなxmlファイルを持っています。簡潔にするため、私はそれを完全なものとしてリストアップしていません。XSLTの名前空間と変数を扱う

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<OBJECTS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     xmlns="http://www.example.com/" 
     xsi:schemaLocation=".\\intermediate\\example.xsd"> 
    <OBJECT> 
     <abbreviation>ABCD</abbreviation> 
     <LINKS> 
     .... 

私はXSLTでその一部を参照したいと思います。

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:t="http://www.example.com/" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=".\\intermediate\\example.xsd"> 

<xsl:output method="xml" indent="yes" encoding="utf-8"/> 
<xsl:strip-space elements="*"/> 

<xsl:variable name="objs" select ="t:OBJECTS/OBJECT"/> 
<xsl:variable name="cnt" select="count($objs)"/> 

<xsl:template match="t:*"> 
Count of objects is <xsl:value-of select="$cnt" /> 
</xsl:template> 

</xsl:stylesheet> 

私の意図は、その名前空間ごとにすべてのオブジェクトの数を表示することです。私はこれを達成できませんでした。

Count of objects is 100. 

XMLファイル内の名前空間を削除すると、私はそれを取得します。どこに問題がありますか?

答えて

1
あなたが達成したいものを

100%わからないが、私はあなたの子供のセレクタにt:接頭辞を使用していない気づいたので、私は

<xsl:variable name="objs" select ="t:OBJECTS/t:OBJECT"/> 

代わりの

を使用することを示唆しています
<xsl:variable name="objs" select ="t:OBJECTS/OBJECT"/> 
+1

これは正しいです。デフォルトの名前空間(接頭辞なし)は継承されているので、 'OBJECT'は親の' OBJECTS'と同じ名前空間にあります。 –

+0

それは完全に働いた。私の目的は、単一のxsltを使用して、複数の名前空間から複数のXML文書を処理することです。私は部分的にこれまでに成功しており、非常に短時間で正確なポインタを与えることに100万ドルの感謝をしています。 –