提问人:Larry 提问时间:8/28/2009 最后编辑:Larry 更新时间:8/18/2017 访问量:46670
具有默认命名空间设置为 xmlns 的 XML 源的 XSLT
XSLT with XML source that has a default namespace set to xmlns
问:
我有一个 XML 文档,其根目录处指示了默认命名空间。 像这样的东西:
<MyRoot xmlns="http://www.mysite.com">
<MyChild1>
<MyData>1234</MyData>
</MyChild1>
</MyRoot>
用于分析 XML 的 XSLT 无法按预期工作,因为 默认命名空间,即当我删除命名空间时,一切都像 预期。
这是我的 XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:template match="/" >
<soap:Envelope xsl:version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<NewRoot xmlns="http://wherever.com">
<NewChild>
<ChildID>ABCD</ChildID>
<ChildData>
<xsl:value-of select="/MyRoot/MyChild1/MyData"/>
</ChildData>
</NewChild>
</NewRoot>
</soap:Body>
</soap:Envelope>
</xsl:template>
</xsl:stylesheet>
需要对 XSLT 文档执行哪些操作才能使翻译正常工作?XSLT 文档中到底需要做什么?
答:
77赞
Pavel Minaev
8/28/2009
#1
您需要在 XSLT 中声明命名空间,并在 XPath 表达式中使用它。例如:
<xsl:stylesheet ... xmlns:my="http://www.mysite.com">
<xsl:template match="/my:MyRoot"> ... </xsl:template>
</xsl:stylesheet>
请注意,如果要在 XPath 中引用该命名空间中的元素,则必须提供一些前缀。虽然你可以不使用前缀,并且它适用于文本结果元素,但它不适用于 XPath - 在 XPath 中,无前缀名称始终被视为位于具有空白 URI 的命名空间中,无论范围内是否有任何内容。xmlns="..."
xmlns="..."
评论
0赞
Larry
8/28/2009
谢谢你的回答。它类似于我在互联网上找到的,但它不起作用。我的XML输出仍然无法按预期工作。如果我从源 XML 中删除默认命名空间,那么输出 XML 看起来没问题。我执行 XSLT 转换的应用程序是 .NET 2.0 应用程序,如果这有所作为的话。
1赞
Pavel Minaev
8/28/2009
那么,请出示您的 XLST 不起作用。如果不看到它,很难说出更明确的话。你所描述的听起来仍然像你错过了命名空间限定符 somwhere。例如,请记住,您必须对每个 XPath 步骤重复它 - 即 ./my:MyRoot/my:foo/my:bar
1赞
Dominic Cronin
9/1/2014
关于需要前缀的非常有用的说明。这促使我检查规格。看起来,如果存在默认命名速度,XPath 将遵循默认命名速度,但 XSLT 明确地将默认命名空间排除在范围之外 w3.org/TR/xslt#section-Expressions
0赞
Our Man in Bananas
9/2/2014
@PavelMinaev:我在我的 xPath 中使用了,所以我的模板匹配如下所示: - 那么什么是 MyRoot - 这是 XSLT 中的保留名称吗?/my:MyRoot
<xsl:template match="/my:MyRoot">
0赞
Pavel Minaev
9/5/2014
不,它只是一个元素名称。您应该使用最外层元素的名称作为 XML 的名称。
38赞
vinh
4/5/2011
#2
如果使用 XSLT 2.0,请在该节中指定。xpath-default-namespace="http://www.example.com"
stylesheet
4赞
hama4g
3/28/2012
#3
如果这是命名空间问题,则可以尝试修改 xslt 文件中的两件事:
- 在 XSL:Stylesheet 标记中添加“my”命名空间定义
- 在遍历 XML 文件时调用元素时,请使用“my:”前缀。
结果
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="http://www.w3.org/2001/XMLSchema">
<xsl:template match="/" >
<soap:Envelope xsl:version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<NewRoot xmlns="http://wherever.com">
<NewChild>
<ChildID>ABCD</ChildID>
<ChildData>
<xsl:value-of select="/my:MyRoot/my:MyChild1/my:MyData"/>
</ChildData>
</NewChild>
</NewRoot>
</soap:Body>
</soap:Envelope>
</xsl:template>
</xsl:stylesheet>
评论