未在 XSLT 中引用默认命名空间 [重复]

Posted

技术标签:

【中文标题】未在 XSLT 中引用默认命名空间 [重复]【英文标题】:Not Referencing Default Namespace in XSLT [duplicate] 【发布时间】:2018-10-07 10:36:41 【问题描述】:

我在尝试引用的 xml 文件中的默认命名空间有问题。有谁知道这个默认的 ns 给我带来了如此多的悲伤。我已经束手无策了!

输入XML

<?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 返回任何东西,但是一旦我删除了默认命名空间,一切都很好。我在这里错过了什么????

谢谢

【问题讨论】:

搜索“XSLT 默认命名空间”可找到此问题的 641 个先前答案。 【参考方案1】:

试试这个:

<?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>

您缺少命名空间

【讨论】:

@Derek,如果它比accept这个答案更适合你【参考方案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" 的使用仅适用于&lt;Foo&gt; 标记,因此它们位于此默认命名空间中。它不包括您的 xpath 表达式 &lt;xsl:value-of select="//someStatus"/&gt;,否则它将在 no namespace 中选择 someStatus

【讨论】:

以上是关于未在 XSLT 中引用默认命名空间 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

XSLT 将命名空间前缀添加到元素最佳实践

使用 xslt 引用具有不同命名空间的元素

在可视化映射器中将命名空间添加到根节点

重命名元素的 XSLT 问题——更改命名空间

将命名空间添加到根元素

如何使用 XSLT 替换命名空间中的元素?