2012-07-30 102 views
-2

我想通过XSLT转换将XML文档解析到网站。C#XSLT转换中的XPath问题

然而,使它工作我必须使用以下XPath:

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

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

/standards/standard 
+2

我认为这是因为您的转换引擎不是您正在使用的默认名称空间的轴,尝试添加映射。 – 2012-07-30 11:33:18

+2

什么是问题? – Utkanos 2012-07-30 11:33:47

回答

2

您的问题是在XPath的最常见问题 - 搜索XPath和缺省命名空间,你会发现很多好的答案。

总结问题:XPath将任何无前缀的名称解释为属于“no namespace”。

因此,任何属于某个默认命名空间(不是“no命名空间”)的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 
1

我不知道你的问题是什么。只需服用野生刺,或许这就是你想要的...

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