В XPath 1.0, как я могу проверить, находится ли строка длиной 1 между двумя другими по кодам? - PullRequest
2 голосов
/ 25 июля 2010

Учитывая документ, содержащий эти теги, как я могу определить, является ли "" <"H" <"z" в кодировке документа?Я пытаюсь сделать это в XPath 1.0.</p>

<text>H</text>
<range>
  <from>&#x20;</from>
  <to>z</to>
</range>

Возможно, мне даже удастся обойтись без использования функции contains (), но как тогда создать строку, содержащую символы от "" до "z" для проверки?

Ответы [ 2 ]

1 голос
/ 25 июля 2010

Это преобразование определяет, находится ли символ ascii в (включительно) диапазоне любых двух символов ascii :

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

 <xsl:variable name="vAscii"> !"#$%&amp;'()*+,-./0123456789:;&lt;=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~</xsl:variable>

 <xsl:template match="/*">
  <xsl:call-template name="isInRange">
    <xsl:with-param name="pChar" select="text"/>
    <xsl:with-param name="pStarting" select="range/from"/>
    <xsl:with-param name="pEnding" select="range/to"/>
  </xsl:call-template>
 </xsl:template>

 <xsl:template name="isInRange">
  <xsl:param name="pChar"/>
  <xsl:param name="pStarting"/>
  <xsl:param name="pEnding"/>

  <xsl:value-of select=
   "contains($vAscii, $pChar[1])

   and

    string-length(substring-before($vAscii, $pChar[1]))
   >=
    string-length(substring-before($vAscii, $pStarting))

   and

    string-length(substring-before($vAscii, $pEnding))
   >=
    string-length(substring-before($vAscii, $pChar[1]))

   "/>
 </xsl:template>
</xsl:stylesheet>

при применении к следующему документу XML (который содержит в точности предоставленный фрагмент XML):

<t>
    <text>H</text>
    <range>
        <from>&#x20;</from>
        <to>z</to>
    </range>
</t>

дает желаемый результат :

true

При применении к этому документу XML :

<t>
    <text>H</text>
    <range>
        <from>A</from>
        <to>G</to>
    </range>
</t>

снова получается правильный результат :

false
0 голосов
/ 25 июля 2010

Я не думаю, что это возможно с XPath 1.0. Это с 2.0, хотя с использованием функции fn: Compare: http://www.w3.org/2005/xpath-functions/#compare

Я не могу попробовать это, но я думаю, XPath будет:

fn:compare(text, range/from) > 0 and fn:compare(text, range/to) < 0
...