2011-07-15 12 views
1

私はこれに似た名前空間を持つxml文書を持っていますが、質問をするために単純化しました。XML名前空間は私のXSLTを投げ捨てています

<MyNameSpace xmlns="http://schemas.microsoft.com/dynamics/2006/02/documents/MyNameSpace"> 
<IDmain>ins</IDmain> 
    <Table_1 class="entity"> 
     <Address>Oak Park Drive</BillingProviderAddress> 
     <City>Lake Elizabeth</BillingProviderCity> 
     <Name>Corporation</BillingProviderOrgName> 
     <InvoiceLine class ="entity"> 
      <DateService>1234</DateService> 
     </InvoiceLine> 
    <Table_1> 
</MyNameSpace> 

ここでXSLTを作成しました。 XSLTのエキスパートではありませんが、これは「厄介な問題を解決する」瞬間です。

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 
<xsl:template match="/"> 

<xsl:variable name="vPrefix"> 
<xsl:value-of select="MyNameSpace/Table_1/Address"/> 
<xsl:text>|</xsl:text> 
<xsl:value-of select="MyNameSpace/Table_1/City"/> 
<xsl:text>|</xsl:text> 
<xsl:value-of select="MyNameSpace/Table_1/Name"/> 
<xsl:text>|</xsl:text> 
</xsl:variable> 

<xsl:for-each select="MyNameSpace/Table_1/InvoiceLine"> 
     <xsl:value-of select="$vPrefix"/> 
     <xsl:text>|</xsl:text> 
     <xsl:value-of select="DateService"/> 
</xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

さて、XSLTは、私はそれは、問題がある、私のテストデータは、XML文書の上部に、このファンキーな名前空間を含めるかを正確に行います。

のxmlns =「http://schemas.microsoft.com/dynamics/2006/02/documents/MyNameSpace」、私はXMLPADを使用していますが、私は、スクリプトを実行すると、それが実際にうまくない

2つのことそこの名前空間。

残念ながら、私が必要とする別のXSLTツールで実行しようとすると(実行時に)正しく実行されないため、その解決策は理想的ではありません。

名前空間が私が使用しているXSLTを捨てていることはわかっています。なぜなら、XMLからXMLを削除すると、テストで正常に動作するからです。しかし、このプロセス全体が実際に自動化されているため、この解決策は妥当性はありません。だから私は名前空間の問題を解決する必要があります。

Anythoughts?

+2

整形式入力XML –

+0

["重複"とfaq]を提供します(http://stackoverflow.com/questions/1344158/xslt-with-xml-source-that-has-a-default-namespace-set -to-xmlns)。 –

+2

* XSLTは私が望んでいるものとまったく同じですが、問題は私のテストデータです - それはちょうど私を笑わせます。 – LarsH

答えて

5

特定の要素に一致させるために使用しているXSLTの一部であるXPathは、名前空間に影響されます。 MyNameSpace/Table_1/AddressのようなXPathを使用している場合、要素とXML名前空間なしで一致します;現在のコンテキストノードの子である任意の要素MyNameSpaceの子である任意の要素Table_1の子である任意の要素Addressが含まれます。

名前空間接頭辞を追加する必要があります。例えば:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:z="http://schemas.microsoft.com/dynamics/2006/02/documents/MyNameSpace"> 

... 

<xsl:value-of select="z:MyNameSpace/z:Table_1/z:Address"/> 

XPathを評価する際残念ながら、XSLT 1.0は、現在のデフォルトの名前空間を考慮していないので、あなたはだけのデフォルトの名前空間を設定していないことができますし、それを使って行うこと。名前空間接頭辞が本当に必要です。

XSLT 2.0を使用できる場合は、xpath-default-namespace属性を使用して、XPathクエリで参照される要素の既定の名前空間を設定できます。 (XSLT 2.0は、かなり多くの実用的な小さな多くの点で、このようなものです...)

+0

+1良い説明 –

2

あなたはlocal-name()

例えば上の要素のための一般的な試合と述語フィルタを使用することができます*[local-name()='MyNameSpace']/*[local-name()='Table_1']/*[local-name()='Address']

WARNING:同じ名前を持つ別の名前空間修飾要素を持つ文書を持っている場合は、予期しない結果を得ることができるので、これは、より一般的な試合です。

関連する問題