0

我知道当涉及到 .NET(或者至少是我正在使用的 .NET 版本)时,如果我想从具有非默认命名空间的 XML 文档中查询数据,我至少有两个选择:

1. use the local-name() function before referencing a
node in the xpath expression.

2. work with the XmlNamespaceManager class and assign prefixes
that then need to be referenced in the xpath expression.

最近我一直在使用 XSLCompiledTransform 类,并且在从具有非默认命名空间的 XML 文件中读取数据时遇到了类似的问题。

由于将编写实际 XSL 文件的人可能不知道他们需要使用 local-name() 函数,并且无法控制他们将使用的 XML 文件,所以我可以按代码顺序做些什么忍受 XSLCompiledTransform 类正确解释 (/node0/node1/node2/etc) 形式的 xpath 表达式?

4

2 回答 2

2

通常,正确的做法是为将要使用的命名空间分配前缀并使用它们,无论是在 XSLT 中还是在 XmlNamespaceManager 中。当你不需要时使用local-name()绕过命名空间是相当hackish。

我对您问题的后半部分和您的要求感到有些困惑。您将在 XslCompiledTransform 类中使用哪种 XPath?您指的是 XSLT 本身中的 XPaths 吗?

关于命名空间的事情是,只要 URI 匹配,前缀可以是任何东西。因此,您对“无法控制他们将使用的 XML 文件”的评论可能是不必要的担忧。例如,如果输入 XML 如下所示:

<aa:root xmlns:aa="http://my.namespace.com">
   <aa:child>Hello!</aa:child>
</aa:root>

您可以拥有这样的 XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:bb="http://my.namespace.com">
    <xsl:template match="bb:root">
       <xsl:value-of select="bb:child" />
    </xsl:template>
</xsl:stylesheet>

一切都会正常工作,因为命名空间 URI 匹配。这比在 XSLT 中散布local-name()s 更可取。

于 2013-02-04T15:46:06.917 回答
2

如果编写 XSLT 代码的人不知道在 XML 实例中将使用哪些名称空间,那么他们就是在黑暗中工作——这与不知道将使用哪些本地名称大致相同(实际上完全相同),因为元素名称由两个部分组成,一个 URI 和一个本地名称,您需要知道这两个部分。如果您事先不知道全名,您始终可以通过通配符选择元素并发现它们的名称——这本质上就是您使用 local-name() 时所做的事情——但这是一项艰苦的工作。

于 2013-02-04T16:30:10.587 回答