Проблема XSLT: поиск в строках подстроки "" "или" & # x003E; " - PullRequest
0 голосов
/ 06 мая 2011

Я изучаю XSLT и на данный момент я действительно застрял и не могу найти решение. Я действительно был бы признателен, если бы вы могли помочь мне с этим. Ниже вы можете найти пример

значение строки $:

<img src="Afbeeldingen_Hotpot/beer.jpg" alt="afbeelding van een beer" title="beer" width="170" height="144" style="display:block; margin-left:auto; margin-right:auto; text-align:center;" style="float:center;" />

Моя цель - отфильтровать высоту изображения ... В этом примере "144". the functx: index-of-string, который я получил с этого сайта: http://www.xsltfunctions.com/xsl/functx_index-of-string.html

Это код XSLT, который я сейчас использую:

    <xsl:variable name="positionHeight" as="xs:integer"><xsl:value-of select="functx:index-of-string($string,'height=') + 8"/></xsl:variable>
    <xsl:variable name="partStringHeight" as="xs:string"><xsl:value-of select="substring($string,$positionHeight)"/></xsl:variable>
    <xsl:variable name="lengthHeight" as="xs:integer"><xsl:value-of select="functx:index-of-string($partStringHeight,'style=' - 3)"/></xsl:variable>
    <xsl:variable name="height" as="xs:string"><xsl:sequence select="substring($partStringHeight,1,$lengthHeight)"/></xsl:variable>

Ниже кода XSLT, который я хочу использовать, но выдает ошибку, потому что индекс строки для "" "равен нулю".

    <xsl:variable name="positionHeight" as="xs:integer"><xsl:value-of select="functx:index-of-string($string,'height=') + 8"/></xsl:variable>
    <xsl:variable name="partStringHeight" as="xs:string"><xsl:value-of select="substring($string,$positionHeight)"/></xsl:variable>
    <xsl:variable name="lengthHeight" as="xs:integer"><xsl:value-of select="functx:index-of-string($partStringHeight,'&quot;' - 1)"/></xsl:variable>
    <xsl:variable name="height" as="xs:string"><xsl:sequence select="substring($partStringHeight,1,$lengthHeight)"/></xsl:variable>

Есть ли способ получить индекс подстроки, например:

&quot; and &amp;#x003E;

Поскольку у меня много строк, где мне нужна высота, но там, где "style =" не встречается ..

1 Ответ

2 голосов
/ 06 мая 2011

Обычное решение в XSLT - поместить неудобную строку в значение переменной (не используя select):

<xsl:variable name="quot">"</xsl:variable>

Тогда

<xsl:variable name="lengthHeight" as="xs:integer"
   select="functx:index-of-string($partStringHeight,$quot) - 1" />

Также обратите вниманиечто вы поставили - 3 или - 1 в index-of-string() скобках.Конечно, вы хотите вычесть 3 или 1 из возвращаемого значения из index-of-string()?Потому что на самом деле не имеет смысла вычитать 3 или 1 из ".

Кроме того, использование <xsl:value-of /> внутри тела определения переменной, такого как это, обычно избыточно.Я удалил его.

Наконец, вы можете использовать substring-before() и substring-after(), чтобы получить то, что вы хотите с меньшими хлопотами:

<xsl:variable name="beforeHeight" as="xs:integer">height="</xsl:variable>
<xsl:variable name="afterHeight" as="xs:string">" style=</xsl:variable>
<xsl:variable name="height" as="xs:string"
  select="substring-before(substring-after($string, $beforeHeight), $afterHeight)" />

На самом деле я не уверен из вашего вопроса,значение входной строки, которое вы указали вверху, было до или после разбора XML.Если это было после синтаксического анализа, т. Е. Сами строковые данные содержат &quot;, а не ", введите &quot;, но вам нужно экранировать & как &amp;:

<xsl:variable name="beforeHeight" as="xs:integer">height=&amp;quot;</xsl:variable>
<xsl:variable name="afterHeight" as="xs:string">&amp;quot; style=</xsl:variable>

В этом случае у вас не будет кавычек в строках, поэтому вам не нужно помещать значения в такие переменные;но это, вероятно, хорошая идея для удобочитаемости.

Аналогично &amp;#x003e нужно будет экранировать как &amp;amp;#x003e.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...