gpt4 book ai didi

xml - 使用 XSLT 检查 XML 节点名称是否包含字母

转载 作者:行者123 更新时间:2023-12-04 04:45:58 29 4
gpt4 key购买 nike

这不是关于此的唯一问题,但我无法从其他解决方案中弄清楚为什么我的代码是错误的。这是一个任务,我已经弄清楚了大部分,但我不明白为什么条件永远不会评估为真。如果我编了一个伪子句,例如 contains('a', 'a')甚至 1=1然后我可以看到正确的输出(显然,没有被条件过滤)。

另外,如果我只是尝试使用 <xsl:value-of select="name(.)" /> 输出当前元素的名称什么都没有输出。显然,有些东西我没有得到,但它让我望而却步。任何线索?

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" indent="yes" encoding="ISO-8859-1"/>

<xsl:template match="/">
<xsl:apply-templates select="node()" />
</xsl:template>

<xsl:template match=".">
<xsl:if test="contains(name(.),'a')">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates select="child::node()" />
</xsl:copy>
</xsl:if>
</xsl:template>
</xsl:stylesheet>

在这种情况下,XML 模式根本无关紧要。我知道有些元素包含字母 a(包括根元素)。

还有为什么我调用 <xsl:value-of select="name(node())" />我得到了 XSLT 文件节点的名称(“xsl:stylesheet”),而不是我的 XSLT 文档正在处理的文件中当前节点的名称?

谢谢!

最佳答案

我很惊讶您在运行 XSLT 时没有收到错误,因为当我尝试使用 Mircosoft 的 XSLT 处理时,我收到错误“谓词之外的模式中只允许使用‘子’和‘属性’轴。”。这是因为在 XPath 中,点是上下文节点的缩写。

我想知道您使用的 XSLT 处理是否与 match="." 匹配顶级文档节点(类似于做 match="/")这将解释为什么你没有得到任何输出。

无论如何,您确实需要<xsl:template match="*">在这里,而不是 <xsl:template match="." />
但是您真正应该做的来解决这个问题是基于 XSLT Identity Transform ,这是 XSLT 中的基本设计模式。它自己复制输入 XML 中的所有现有节点,但您可以只为您需要的情况添加额外的模板匹配。

在您的情况下,您说您只想复制名称中包含“a”的元素。好吧,反过来想想,在这种情况下,您“不想”复制名称中没有 'a' 的元素。因此,您需要添加到身份转换中的只是这个模板

<xsl:template match="*[not(contains(name(), 'a'))]" />

顺便说一句,您在这里并不真正需要“/”的初始模板
<xsl:template match="/">
<xsl:apply-templates select="node()" />
</xsl:template>

XSLT 有内置模板的概念,在 XSLT 中没有显式模板时使用。这些内置模板将输出文本节点的文本,而对于其他节点,它将继续处理子节点(不复制节点)。因此,“/”的所有模板所做的都是内置模板所做的。

关于xml - 使用 XSLT 检查 XML 节点名称是否包含字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18176945/

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