5

我对带有撇号的文本有疑问

例如,我尝试测试这个具有符号的 xml,那么我该如何比较?

<xsl:for each select="country[nation='India's]">

这是显示错误的语句

问候南达.A

4

1 回答 1

10

一种方法是:

<xsl:variable name="apos" select='"&apos;"'/>

<!-- ... later ... -->

<xsl:for-each select="country[nation=concat('India', $apos, 's')]">

这里的问题是双重的:

  • XSLT 没有定义字符串中的字符转义方式。所以'India\'s'不是一个选择。
  • 您必须通过两个不同的评估层。

这些是:

  1. XML 格式正确:XSLT 程序所包含的 XML 文档必须格式正确。您不能违反 XML 规则。
  2. XSLT 表达式解析:生成的属性值字符串(在完成 XML DOM 解析之后)必须对 XSLT 引擎有意义。

构造如下:

<xsl:for-each select="country[nation='India's']">
<xsl:for-each select="country[nation='India&apos;s']">

通过 XML 层但违反了 XSLT 层,因为在这两种情况下,有效的属性值(存储在 DOM 中)都是country[nation='India's'],这显然是 XPath 语法错误。

构造如下:

<xsl:for-each select="country[nation=concat('India', "'", 's')]">
<xsl:for-each select="country[nation=concat("India", "&apos;", "s")]">

明显违反了 XML 层。但是它们不会违反 XSLT 层 (!),因为它们的实际值(如果 XSLT 文档可以首先被解析的话)会显示为country[nation=concat('India', "'", 's')],这作为 XPath 表达式是完全合法的。

所以你必须想办法同时通过第 1 层和第 2 层。一种方式是如上所示的可变方式。另一种方法是:

<xsl:for-each select="country[nation=concat('India', &quot;'&quot;, 's')]">

这在 XSLT 中看起来是country[nation=concat('India', "'", 's')].

就个人而言,我发现“可变方式”更容易使用。

于 2010-03-19T16:49:06.650 回答