2008-11-12 12 views
12

मैं एक XML दस्तावेज की तरह कुछ :::नामस्थानों के साथ एक्सएमएल से 'चयन' कैसे करें?

<?xml version="1.0" encoding="utf-8"?> 
<?mso-application progid="Excel.Sheet"?> 
<Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
      xmlns:o="urn:schemas-microsoft-com:office:office" 
      xmlns:x="urn:schemas-microsoft-com:office:excel" 
      xmlns="urn:schemas-microsoft-com:office:spreadsheet"> 
    <Worksheet ss:Name="Worksheet1"> 
    <Table> 
     <Column ss:Width="100"></Column> 

     <Row> 
     <Cell ss:Index="1" ss:StyleID="headerStyle"> 
      <Data ss:Type="String">Submitted By</Data> 
     </Cell> 
     </Row> 
     <Row> 
     <Cell ss:Index="1" ss:StyleID="alternatingItemStyle"> 
      <Data ss:Type="String">Value1-0</Data> 
     </Cell> 
     </Row> 
    </Table> 
    <AutoFilter xmlns="urn:schemas-microsoft-com:office:excel" 
       x:Range="R1C1:R1C5"></AutoFilter> 
    </Worksheet> 
</Workbook> 

<xsl:for-each select="//Row"> 
    <xsl:copy-of select="."/> 
    </xsl:for-each> 

यह मिलान नहीं कर रहा है के साथ समस्या यह है जब पंक्तियों का चयन करने की कोशिश कर रहा है। मैंने सभी नाम-दूरी को हटा दिया और यह ठीक काम करता है। तो, मैं पंक्ति से मिलान करने के लिए 'चयन' कैसे प्राप्त करूं?

उत्तर

28

अपने XSLT में नाम स्थान के लिए एक नामस्थान उपसर्ग घोषित और फिर select कि उपसर्ग का उपयोग करके:

<xsl:stylesheet ... xmlns:os="urn:schemas-microsoft-com:office:spreadsheet"> 
    ... 
    <xsl:for-each select="//os:Row"> 
    ... 
    </xsl:for-each> 
    ... 
</xsl:stylesheet> 

यह आमतौर पर XPaths कि पढ़ने में आसान हों का परिणाम है। हालांकि, XSLT/XPath उपकरण के बाद, बराबर कोड बनाएं:

<xsl:for-each select="//*[local-name()='Row' = and namespace-uri()='urn:schemas-microsoft-com:office:spreadsheet']"> 
    ... 
</xsl:for-each> 
+2

उत्तरार्द्ध अधिक संक्षिप्त लगता है। धन्यवाद। –

10

आप नाम स्थान के बारे में परवाह नहीं है, तो आप XPath `स्थानीय नाम का उपयोग कर सकते() 'समारोह:

<xsl:for-each select="//*[local-name() = 'Row']"> 
    <xsl:copy-of select="."/> 
</xsl:for-each> 

वैकल्पिक रूप से एक ही एक ही बात इस तरह व्यक्त किया जा सकता। मुझे यकीन नहीं है कि यह मानक XPath है और यदि सभी XPath कार्यान्वयन इसका समर्थन करते हैं (कोल्डफ्यूजन करता है, तो शायद जावा भी करता है)। शायद कोई जानता है कि यह किसी भी मानक के अनुरूप है।

<xsl:for-each select="//:Row"> 
    <xsl:copy-of select="."/> 
</xsl:for-each> 
+1

यह क्यूएनएम परीक्षण '*: स्थानीय नाम 'केवल एक्सएसएलटी/XPath 2.0 –

+0

में मान्य है यह समाधान थोड़ा गंदा, लेकिन प्रभावी है। इसने मेरी समस्या भी हल की (एक फिसलन नामित बच्चे नोड का चयन करने की कोशिश कर रहा है)। –

+0

@ केविन इसका कौन सा हिस्सा? पहला या दूसरा? – Tomalak

7

Tomalek और ckarras अच्छा जवाब देने के, लेकिन मैं उन्हें पीछे के कारणों को स्पष्ट करना चाहते हैं।

तत्वों आप मिलान नहीं कर रहे हैं क्षेत्र के डिफ़ॉल्ट नाम स्थान जिसमें वे दस्तावेज़ में पाए जाते हैं कर रहे हैं, वह है, वे एक उपसर्ग (जैसे

xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
बिना नाम स्थान कि क्षेत्र के लिए घोषित कर रहे हैं Workbook तत्व पर

)। भले ही टैगनाम में नामस्थान उपसर्ग की कमी हो, फिर भी वे एक नामस्थान में हैं।

हालांकि, XPath की आवश्यकता है कि नामस्थान में तत्वों के सभी नाम उपसर्ग के साथ योग्य हों, या नामस्थान को भविष्य में namespace-uri() के साथ स्पष्ट रूप से निर्दिष्ट किया जाए। इसलिए, आपको तत्व नाम से मेल खाने के लिए भविष्य में local-name() फ़ंक्शन का उपयोग करना होगा (और namespace-uri() फ़ंक्शन का उपयोग करें, साथ ही नामस्थानों में नाम टकराव का खतरा होने पर भी), या आपको प्रत्येक नेमस्पेस घोषित करना होगा जिसमें आप तत्वों से मिलान करना चाहते हैं एक उपसर्ग के साथ XPaths में, और XPath अभिव्यक्तियों में उनके नामस्थान उपसर्गों के साथ तत्व नामों को अर्हता प्राप्त करें।

संबंधित मुद्दे