2016-05-16 9 views
0

xpathに関連する問題をデバッグしようとしています。 xmlドキュメントを割り当てるXSLTで変数$ MetaDataを作成しましたが、何らかの理由でforeachループがその子を見つけられず、foreachループに入ることができませんでした。XSLT for-eachのXPATHが見つかりません

XSLT:

<!-- language: lang-xslt --> 
<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet 
    version="1.0" 
    xmlns="http://www.w3.org/TR/xhtml1/strict" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"> 

    <xsl:variable name="_MetaData"> 
    <MetaData> 
     <EmployeeId>1233</EmployeeId> 
     <EmployeeName>abcd</EmployeeName> 
    </MetaData> 
    </xsl:variable> 
    <xsl:variable name="MetaData" select="msxsl:node-set($_MetaData)"></xsl:variable> 

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

    <xsl:template match="*[local-name()='MetaDataTag']"> 
    <xsl:copy> 

     <MetaData VocabularyOwner="acme.com" Vocabulary="MetaData"> 
     <xsl:for-each select="$MetaData//MetaData/*"> 
      <xsl:element name="Occurrence"> 
      <xsl:attribute name="Id"> 
       <xsl:value-of select="local-name(.)"/> 
      </xsl:attribute> 
      <xsl:attribute name="Value"> 
       <xsl:value-of select="string(.)"/> 
      </xsl:attribute> 
      </xsl:element> 
     </xsl:for-each> 
     </MetaData> 

    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

はXML:

<?xml version="1.0" encoding="utf-8" ?> 
<Envelope> 
    <MetaDataTag /> 
</Envelope> 

私は= "http://www.w3.org/TR/xhtml1/strict" 名前空間のxmlnsのxmlnsを削除すると、すべてがそうですうまく動作し、私はループの中に入ることができます。 xmlns = "http://www.w3.org/TR/xhtml1/strict"名前空間を削除せずにこの問題を解決する方法がわかりません。

答えて

1

XSLTでデフォルトの名前空間を定義すると、変数のノードはその名前空間に入ります。 Xpathにはデフォルトの名前空間がないため、$MetaData//MetaData/*{http://www.w3.org/TR/xhtml1/strict}MetaData要素ノードと一致しません。

解決策の1つは、local-name()を使用して名前空間を無視することです。

`$MetaData//*[local-name() = 'MetaData']/*` 

それとも、あなたのXPath式について(追加)の接頭辞を定義することができます...

<xsl:stylesheet 
    version="1.0" 
    xmlns="http://www.w3.org/TR/xhtml1/strict" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xhtml="http://www.w3.org/TR/xhtml1/strict"> 

    ... 
</xsl:stylesheet> 

...と表現でそれを使用します。

`$MetaData//xhtml:MetaData/*` 

しかし、それは良いアイデアは、空の名前空間内のデータ要素を作成するだろうので、タグはXHTML名前空間に有効ではありません。

<xsl:variable name="_MetaData"> 
    <MetaData xmlns=""> 
    <EmployeeId>1233</EmployeeId> 
    <EmployeeName>abcd</EmployeeName> 
    </MetaData> 
</xsl:variable> 
<xsl:variable name="MetaData" select="msxsl:node-set($_MetaData)"/> 

それとも、彼らのために特定の名前空間を定義します。.. 。

<xsl:stylesheet 
    version="1.0" 
    xmlns="http://www.w3.org/TR/xhtml1/strict" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:data="urn:data"> 

    <xsl:variable name="_MetaData"> 
    <data:MetaData> 
     <data:EmployeeId>1233</data:EmployeeId> 
     <data:EmployeeName>abcd</data:EmployeeName> 
    </data:MetaData> 
    </xsl:variable> 
    <xsl:variable name="MetaData" select="msxsl:node-set($_MetaData)"/> 
    ... 
</xsl:stylesheet> 

は、式で使用するには:

$MetaData//data:MetaData/* 
関連する問題