25

XSLT で一重引用符でデータを部分文字列化しようとしました:

String : DataFromXML:'12345'

期待される結果:12345

<xsl:value-of select="substring-after('$datafromxml','DataFromXML:')"/>

結果:'12345'

以下のコードを試しました

<xsl:value-of select="substring-after('$datafromxml','DataFromXML:&#39;')"/>

<xsl:value-of select="substring-after('$datafromxml','DataFromXML:&apos;')"/>

<xsl:value-of select="substring-after('$datafromxml','DataFromXML:'')"/>

エラー:

String literal was not closed 'DataFromXML:'--->'<---
4

5 に答える 5

25

エスケープの一般的なルールは次のとおりです。

1.0 では:

  • 文字列リテラルで属性区切り文字が必要な場合は、XML エスケープ形式を使用する&quot;か、&apos;
  • 文字列リテラルに文字列区切り文字が必要な場合は、うんざりです

2.0 では:

  • 文字列リテラルで属性区切り文字が必要な場合は、XML エスケープ形式を使用する&quot;か、&apos;
  • 文字列リテラルで文字列区切り文字が必要な場合は、それを 2 倍にします (たとえば、'I can''t')。

Vitaliy で示されているように、変数 $quot または $apos を使用すると、コードがより明確になります。

于 2012-09-13T12:37:04.730 に答える
11

これはうまくいくはずです:

<xsl:variable name="apos">'</xsl:variable>

...

<xsl:value-of select="substring-before(substring-after($datafromxml, concat('DataFromXML:', $apos)), $apos)" />
于 2012-09-13T10:25:41.983 に答える
8

xsl:value-ofで " と ' を交換してみることができます

<xsl:value-of select='substring-before
   (substring-after($datafromxml,"DataFromXML:&apos;"), "&apos;")'/> 

または、翻訳機能を利用して厄介なアポストロフィを削除することもできます

 <xsl:value-of select='translate
    (substring-after($datafromxml,"DataFromXML:"), "&apos;", "")'/> 

必ずしもより良いわけではありませんが、変数の必要性がなくなります。

于 2012-09-13T11:27:47.863 に答える
4

最も複雑なケース (文字列に引用符とアポストロフィの両方が含まれる) でも、変数を使用せずに数値を抽出できます

次の XML ドキュメントがあるとします。

<t>' "12345' "</t>

数字だけを抽出したい。

次の変換では、単一の XPath 式を使用して、まさにそれを行います。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="text()">
     <xsl:value-of select=
     'substring-after(.,"&apos;")
     '/>
==============  
     <xsl:value-of select=
     'substring-before(
       substring-after(substring-after(.,"&apos;"), &apos;&quot;&apos;),
       "&apos;"
                       )
     '/>
 </xsl:template>
</xsl:stylesheet>

結果は次のとおりです。

 "12345' "
==============  
     12345

: 意図的に 2 つの XPath 式を使用しています。最初の式の目的は、2 番目の XPath 式で表現されている内容を理解しやすくすることです。テンプレート本体の最後の部分だけを残すと、xsl:value-ofまさに必要な結果が得られます。

12345
于 2012-09-13T12:53:45.887 に答える