【问题标题】:XPath problems in C# XSLT transformationC# XSLT 转换中的 XPath 问题
【发布时间】:2026-02-03 17:35:01
【问题描述】:

我正在尝试通过 XSLT 转换将 XML 文档解析为网站。

但是,要使其正常工作,我必须使用以下 XPath:

/*[name()='standards']/*[name() = 'standard']

为什么下面的 XPath 表达式不起作用?

/standards/standard

【问题讨论】:

  • 我认为这是因为您的转换引擎不是您使用的默认命名空间的axare,请尝试添加映射。
  • 还有什么问题?

标签: c# xslt xpath


【解决方案1】:

您的问题是 XPath 中最常见的问题——搜索 XPath 和默认命名空间,您会找到很多好的答案。

总结问题:XPath 将任何不带前缀的名称解释为属于“无命名空间”。

因此,不会选择任何 XPath 表达式中属于某个默认命名空间(不是“无命名空间”)的任何无前缀名称。

在定位步骤中继续使用名称的一种方法是向 XPath 处理器指示特定前缀(例如“x”)与默认命名空间相关联。然后发出:

/x:standards/x:standard

在 .NET 中,此类命名空间绑定(称为“命名空间注册”)是使用 XmlNamespaceManager 类完成的。请参阅此complete example

在 XSLT 中,只需在全局级别定义一个命名空间,然后指定 XPath 表达式,其中每个元素名称都以这样定义的前缀作为前缀。

这是一个小例子:

<nums xmlns="some:nums">
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>
</nums>

要处理上述 XML 文档,我们有这个

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:x="some:nums">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
     <xsl:value-of select="/x:nums/x:num[. = 3]"/>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于上述 XML 文档可以正确选择所需元素并输出其字符串值

03

【讨论】:

    【解决方案2】:

    我不知道你的问题是什么。随便一刀,或许这就是你想要的……

    <xsl:stylesheet version="1.0"
      xmlns:msxsl="urn:schemas-microsoft-com:xslt"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:ikas="http://www.ikas.dk"
      exclude-result-prefixes="msxsl ikas">
    <xsl:output method="xml" indent="yes"/>
    
    <xsl:template match="/">
     <div xmlns="http://www.ikas.dk">
      <textarea>
       <xsl:copy-of select="/ikas:standards/ikas:standard"/>
      </textarea>
     </div>
    </xsl:template>
    
    </xsl:stylesheet>
    

    【讨论】: