使用具有非默认名称空间和XSL文件的XML文件时,什么';编写.NET能够理解的XPath表达式的正确方法是什么?

使用具有非默认名称空间和XSL文件的XML文件时,什么';编写.NET能够理解的XPath表达式的正确方法是什么?,.net,xml,xslt,xpath,xslcompiledtransform,.net,Xml,Xslt,Xpath,Xslcompiledtransform,我知道,对于.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 x

我知道,对于.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文件,因此,在代码方面,我可以做些什么来忍受表单(/node0/node1/node2/等)的xpath表达式是否由XSLCompiledTransform类正确解释?

通常,正确的做法是为将要使用的名称空间分配前缀,并使用这些前缀,无论是在XSLT中还是在XmlNamespaceManager中。使用
local-name()

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

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

<aa:root xmlns:aa="http://my.namespace.com">
   <aa:child>Hello!</aa:child>
</aa:root>
<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>

你好
您可以使用如下XSLT:

<aa:root xmlns:aa="http://my.namespace.com">
   <aa:child>Hello!</aa:child>
</aa:root>
<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要好得多。

通常,正确的做法是为将要使用的名称空间分配前缀并使用这些前缀,无论是在XSLT中还是在XmlNamespaceManager中。使用
local-name()

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

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

<aa:root xmlns:aa="http://my.namespace.com">
   <aa:child>Hello!</aa:child>
</aa:root>
<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>

你好
您可以使用如下XSLT:

<aa:root xmlns:aa="http://my.namespace.com">
   <aa:child>Hello!</aa:child>
</aa:root>
<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要好得多。

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

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