5

アポストロフィ記号を含むテキストに問題があります

たとえば、シンボルを持つこのxmlをテストしようとすると、どうすれば比較できますか?

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

これはエラーを示すステートメントです

よろしくナンダ.A

4

1 に答える 1

10

それを行う1つの方法は次のとおりです。

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

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

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

ここでの問題は2つあります。

  • XSLTは、文字列で文字をエスケープする方法を定義していません。したがって'India\'s'、オプションではありません。
  • あなたは評価の2つの異なる層を通過しなければなりません。

これらは:

  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ドキュメントを最初に解析できた場合)はcountry[nation=concat('India', "'", 's')]XPath式として完全に有効であるため、XSLTレイヤー(!)に違反することはありません。

したがって、レイヤー1とレイヤー2の両方を通過する方法を見つける必要があります。1つの方法は、上記のように可変の方法です。別の方法は次のとおりです。

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

これはXSLTにはとして表示されますcountry[nation=concat('India', "'", 's')]

個人的には、「可変的な方法」の方が扱いやすいと思います。

于 2010-03-19T16:49:06.650 に答える