gpt4 book ai didi

xml - 将命名空间添加到 xml 时使用 xslt 解析 xml 失败

转载 作者:数据小太阳 更新时间:2023-10-29 02:27:34 29 4
gpt4 key购买 nike

我有以下 xml 文件:

<DataConfiguration 
xmlns="http://www.mysite.com/namespace"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.mysite.com/namespace/DataConfiguration.xsd">

<rule>
<if>
...
</if>
<then>
...
</then>
</rule>

</DataConfiguration>

我想使用以下 xslt 来解析:

<xsl:stylesheet 
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:doc="http://www.mysite.com/namespace"
exclude-result-prefixes="xsi">

<xsl:output omit-xml-declaration="yes"/>
<xsl:output method="text"/>
<xsl:template match = "/">

<xsl:for-each select="//rule">
<xsl:for-each select="if/*">
...
</xsl:for-each>
</xsl:for-each>

</xsl:template>
</xsl:stylesheet>

xslt 按预期工作,但是当我将 xmlns 属性添加到 xml 的顶部元素时,它找不到 xml 元素。我在这个网站上看到了一些相关问题,但仍然没有弄清楚如何解决我的具体问题。我尝试按照建议将 doc: 添加到选择中 here但它没有帮助。也许是因为我正在使用//?还有其他方法可以执行这些查询吗?

关于如何解决这个问题还有其他建议吗?

最佳答案

这是最大的 XPath XSLT 常见问题解答。只需搜索:"XPath default namespace"

非常简短:

改变:

<xsl:for-each select="//rule">   
<xsl:for-each select="if/*">
...
</xsl:for-each>
</xsl:for-each>

收件人:

<xsl:for-each select="//doc:rule">   
<xsl:for-each select="doc:if/*">
...
</xsl:for-each>
</xsl:for-each>

观察到的令人困惑的问题的原因是,在 XPath 中,任何没有前缀的名称都被认为是在“无 namespace ”中。

因此,select="//rule" 不会选择文档中默认 namespace 中的任何元素——没有名为 rule 的元素不在命名空间中。

相反,XPath 表达式必须包含带前缀的名称,并且前缀必须与默认命名空间相关联——如上述解决方案中所做的那样。

关于xml - 将命名空间添加到 xml 时使用 xslt 解析 xml 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7795128/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com