XML element has namespace, my XPATH does not work

前端 未结 2 1786
情深已故
情深已故 2020-12-05 15:23

I was given the following XML:


  
    
      Item
      
相关标签:
2条回答
  • 2020-12-05 16:05

    In XPath, you have to assign a prefix to the namespace. How you do that depends on the XPath software/library you are using, but assuming you associate the namespace URI http://some_url with the namespace prefix someUrl, you can change your XPath expression as follows:

    /root/items/item/details/someUrl:data
    
    0 讨论(0)
  • 2020-12-05 16:15

    This is one of the most FAQ in XPath / XSLT:

    XPath interprets an unprefixed element name as belonging to "no namespace" and this is the reason elements with unprefixed names belonging to a default (nonempty) namespace aren't selected when only their unprefixed name is specified as a node-test in an XPath expression.

    The solution is either:

    1. Create a namespace binding where a prefix (say "x") is associated with the default namespace, then specify x:elementName instead of elementName.

    2. Use long, ugly and unreliable expressions like: *[name() = 'elementName']

    Here is an XSLT transformation using the above method1. :

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:a="http://some_url">
     <xsl:output method="text"/>
    
     <xsl:template match="/">
      <xsl:value-of select=
      "/root/items/item/details/a:data/a:weight"/>
     </xsl:template>
    </xsl:stylesheet>
    

    When this transformation is applied (using Saxon 6.5.4 or any other compliant XSLT 1.0 processor) on the provided XML document:

    <root>
        <items>
            <item>
                <title>Item</title>
                <details>
                    <data xmlns="http://some_url">
                        <length>10</length>
                        <weight>1.2</weight>
                    </data>
                </details>
            </item>
        </items>
    </root>
    

    The correct/wanted node is selected and its string value is copied to the output:

    1.2
    
    0 讨论(0)
提交回复
热议问题