Substring e indexOf do XSL
observações:
quero seleccionar o texto de um texto isto é ... localizado após a ocorrência de substring
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.)
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.
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)
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>