Substring e indexOf do XSL

Sou novo na XSLT. Eu me pergunto se é possível selecionar uma substring de um item. Estou a tentar analisar um sinal RSS. O valor da descrição tem mais texto do que o que eu quero mostrar. Eu gostaria de obter uma subtração dele baseado no índice de alguma substring. Basicamente, eu quero mostrar o resultado de uma chamada de substring passando indxOf('some_substring') e um comprimento como parâmetros. Isto é possível?

observações:

quero seleccionar o texto de um texto isto é ... localizado após a ocorrência de substring

 19
Author: Carlos Blanco, 2010-12-01

5 answers

Não está claro exatamente o que você quer fazer com o índice de uma subcadeia [update: é mais claro agora - graças], mas você pode ser capaz de usar a função substring-after ou substring-before:

substring-before('My name is Fred', 'Fred')
O

Devolve 'My name is '.

Se precisar de um controlo mais detalhado, a função substring() pode levar dois ou três argumentos: cadeia de caracteres, Índice de partida, comprimento. Omitir o comprimento para obter todo o resto da corda.

Não existe função index-of() para cadeias de caracteres em XPath (apenas para sequências, em XPath 2.0). Podes. utilize string-length(substring-before($string, $substring))+1 Se necessitar especificamente da posição.

Também há contains($string, $substring). Estes estão todos documentados aqui. No XPath 2. 0, poderá usar uma expressão regular correspondente.

(o XSLT usa principalmente XPath para seleccionar os nós e os valores de processamento, por isso esta é na verdade mais uma questão de XPath. Etiquetei-o assim.)

 43
Author: LarsH, 2010-12-01 21:32:51

Aqui está uma linha xpath 1. 0 expressões para IndexOf ($text, $searchString ):

Se necessitar da posição doPrimeiro do texto procurado, ou 0 se não estiver presente:

contains($text,$searchString)*(1 + string-length(substring-before($text,$searchString)))

Se necessitar da posição do primeiro carácter após o texto encontrado, ou 0 se não estiver presente:

contains($text,$searchString)*(1 + string-length(substring-before($text,$searchString)) + string-length($searchString))

Em alternativa, se necessitar da posição do primeiro carácter após o texto encontrado, ou comprimento+1 se não for presente:

1 + string-length($right) - string-length(substring-after($right,$searchString))
Isso deve cobrir a maioria dos casos de que precisa.

Nota: A multiplicação por contém( ... ) causa o resultado verdadeiro ou falso do contém( ... ) função a ser convertida para 1 ou 0, que elegantemente fornece a parte "0 quando não encontrada" da lógica.

 8
Author: MrWatson, 2017-12-11 16:28:42

Quero seleccionar o texto de um texto que se localiza após a ocorrência de substring

Podias usar:

substring-after($string,$match)

Se você quiser uma subtração do acima com algum comprimento, então use:

substring(substring-after($string,$match),1,$length)

Mas os problemas começam se não houver ocurrence da substring correspondente... Então, se você quiser uma sub-sequência com um comprimento específico localizado após a ocorrência de um sub-texto, ou de todo o texto se não houver correspondência, você pode usar:

substring(substring-after($string,substring-before($string,$match)),
          string-length($match) * contains($string,$match) + 1,
          $length) 
 7
Author: , 2010-12-01 18:52:51

O seguinte é o exemplo completo que contém tanto XML como XSLT, onde são usados substring-before e substring-after

<?xml version="1.0" encoding="UTF-8"?>
<persons name="Group_SOEM">
    <person>
        <first>Joe Smith</first>
        <last>Joe Smith</last>
        <address>123 Main St, Anycity</address>
    </person>
</persons>    

O seguinte é o XSLT que muda o valor do Primeiro/Último Nome separando o valor por espaço de modo que, após a aplicação deste XSL, o elemento do primeiro nome terá o valor "Joe" e o último "Smith".

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="first">
    <first>
        <xsl:value-of select="substring-before(.,' ')" />
    </first>
</xsl:template> 
<xsl:template match="last">
    <last>
        <xsl:value-of select="substring-after(.,' ')" />
    </last>
</xsl:template> 
<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()" />
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>   
 5
Author: Hemant, 2012-10-26 21:14:15

Existe uma função de sub-sequência no XSLT. Exemplo Aqui.

 2
Author: Jon, 2010-12-01 17:44:05