XSLT - 深度相等的意外行为
XSLT - Deep equal unexpected behaviour
给定文件 A 包含:
<body>
<ul id="d76e10">
<li id="d76e11">Zoom In: Enlarges.</li>
<li id="d76e13">Zoom Out: Reduces.</li>
</ul>
</body>
文件 B 包含:
<body>
<ul id="d78e10">
<li id="d78e11"><uicontrol id="d78e12">Zoom In</uicontrol>: Enlarges.</li>
<li id="d78e15"><uicontrol id="d78e16">Zoom Out</uicontrol>: Reduces.</li>
</ul>
</body>
最后文件 C 包含:
<body>
<ul>
<li>
<p>Zoom In: Enlarges a section of the chart to show more detail.</p></li>
<li>other stuff</li>
</ul>
</body>
我正在尝试在文件 C 和 A 或文件 C 和 B 之间找到相同的 <li>
标签。
所以基本上,我根据 :
执行以下操作
<xsl:template match="li">
<xsl:variable name="matched-doc"
select="$ref-docs[//li[deep-equal(normalize-space(.), normalize-space(current()))]]" />
<!-- ref-docs contains file A and B. -->
</xsl:template>
当我 运行 这段代码时,我对文件 A 和 B 得到了肯定的命中。
显然,似乎 normalize-space 可能做了一些事情,因为我已经尝试过,但没有像预期的那样受到打击。
谁能帮我理解为什么 normalize-space 似乎会破坏子节点?
此外,如何让 Deep-equal 函数忽略 ID
属性?
函数normalize-space
returns原始字符串值和比较字符串当然不同于比较节点。
至于忽略属性,您需要先转换节点并删除要忽略的属性,然后才能deep-equal
比较转换后的节点。
或者您可以检查您的处理器是否支持对比较有更多控制的扩展,例如 http://saxonica.com/html/documentation/functions/saxon/deep-equal.html,并且该扩展支持您想要的。
给定文件 A 包含:
<body>
<ul id="d76e10">
<li id="d76e11">Zoom In: Enlarges.</li>
<li id="d76e13">Zoom Out: Reduces.</li>
</ul>
</body>
文件 B 包含:
<body>
<ul id="d78e10">
<li id="d78e11"><uicontrol id="d78e12">Zoom In</uicontrol>: Enlarges.</li>
<li id="d78e15"><uicontrol id="d78e16">Zoom Out</uicontrol>: Reduces.</li>
</ul>
</body>
最后文件 C 包含:
<body>
<ul>
<li>
<p>Zoom In: Enlarges a section of the chart to show more detail.</p></li>
<li>other stuff</li>
</ul>
</body>
我正在尝试在文件 C 和 A 或文件 C 和 B 之间找到相同的 <li>
标签。
所以基本上,我根据
<xsl:template match="li">
<xsl:variable name="matched-doc"
select="$ref-docs[//li[deep-equal(normalize-space(.), normalize-space(current()))]]" />
<!-- ref-docs contains file A and B. -->
</xsl:template>
当我 运行 这段代码时,我对文件 A 和 B 得到了肯定的命中。 显然,似乎 normalize-space 可能做了一些事情,因为我已经尝试过,但没有像预期的那样受到打击。
谁能帮我理解为什么 normalize-space 似乎会破坏子节点?
此外,如何让 Deep-equal 函数忽略 ID
属性?
函数normalize-space
returns原始字符串值和比较字符串当然不同于比较节点。
至于忽略属性,您需要先转换节点并删除要忽略的属性,然后才能deep-equal
比较转换后的节点。
或者您可以检查您的处理器是否支持对比较有更多控制的扩展,例如 http://saxonica.com/html/documentation/functions/saxon/deep-equal.html,并且该扩展支持您想要的。