不在XSLT中引用默认命名空间

时间:2018-04-26 16:26:25

标签: xml xslt xpath namespaces

我正在尝试引用xml文件中的默认命名空间。有谁知道乳清这个默认的ns让我如此悲伤。我的智慧结束了!

InputXML

<?xml version="1.0" encoding="utf-8"?>
<contactBatchResponse version="1.0.3"
                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
          xsi:schemaLocation="/somelocation.xsd" 
              xmlns="http://www.somecompany.com">
    <FileStatus>
       <someStatus>get status</someStatus>
    </FileStatus>
</contactBatchResponse>

我的错误xslt :(

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
                 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                 xsi:schemaLocation="/somelocation.xsd" 
                 xmlns="http://www.somecompany.com"
                 exclude-result-prefixes="#default xsi xsl ">

<xsl:output indent="yes" method="xml"/>   
    <xsl:template match="/">
        <Foo>
            <xsl:value-of select="//someStatus"/>
        </Foo>
    </xsl:template>
</xsl:stylesheet>

当我运行这个时,我没有为Foo返回任何内容,但是一旦删除默认命名空间,一切正常。我在这里错过了什么????

谢谢

2 个答案:

答案 0 :(得分:2)

您错过了使用xpath-default-namespace

<xsl:stylesheet version="2.0"
             xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xsi:schemaLocation="/somelocation.xsd" 
             xmlns="http://www.somecompany.com"
             xpath-default-namespace="http://www.somecompany.com" 
             exclude-result-prefixes="#default xsi xsl ">

请注意,您对xmlns="http://www.somecompany.com"的使用仅适用于<Foo>标记,因此它们位于此默认命名空间中。它不包括你的xpath表达式<xsl:value-of select="//someStatus"/>,否则会在没有名称空间的情况下选择someStatus

答案 1 :(得分:2)

试试这个:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="/somelocation.xsd" 
    xmlns:a="http://www.somecompany.com"
    exclude-result-prefixes="xsi xsl a">

    <xsl:output indent="yes" method="xml"/>   
    <xsl:template match="/">
        <Foo>
            <xsl:value-of select="//a:someStatus"/>
        </Foo>
    </xsl:template>
</xsl:stylesheet>

您缺少名称空间