манипулирование подстрокой - PullRequest
1 голос
/ 08 февраля 2012

Я в процессе преобразования html в XML, и все работает нормально, но я немного борюсь за преобразование моей исходной структуры пути в новую.

Ниже приведен пример, объясняющий, чего я хочу достичь:

Что у меня сейчас (упрощенный пример):

<links>
<link>../../../folder1/folder2/folder3/folder4/somefile.png</link>
<link>../../../foldera/folderb/folder/some_other_file.gif</link>
<link>folder_x/yet_another_file.jpg</link>
</links>

Что мне нравится получать:

<links>
<link>somefile.png</link>
<link>some_other_file.gif</link>
<link>yet_another_file.jpg</link>
</links>

Иными словами, какой самый простой подход с использованиемxslt (2), чтобы получить строку после последнего символа "/" в моем тексте

Спасибо за любой совет по этому поводу!

Ответы [ 3 ]

3 голосов
/ 08 февраля 2012

Просто сделайте, например,

<xsl:template match="link">
  <xsl:copy>
    <xsl:value-of select="tokenize(., '/')[last()]"/>
  </xsl:copy>
</xsl:template>

плюс преобразование личности, например,

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* , node()"/>
  </xsl:copy>
</xsl:template>
1 голос
/ 08 февраля 2012

Попробуйте использовать

<xsl:output method="text"/>

<xsl:function name="xfn:substringAfterLast">
  <xsl:param name="arg"/> 
  <xsl:param name="delim"/> 

  <xsl:sequence select="replace ($arg,concat('^.*',xfn:escapeForRegex($delim)),'')"/>
</xsl:function>

<xsl:function name="xfn:escapeForRegex" >              
    <xsl:param name="arg"/> 
   <xsl:sequence select="replace($arg, '(\.|\[|\]|\\|\||\-|\^|\$|\?|\*|\+|\{|\}|\(|\))','\\$1')"/>
</xsl:function>

<xsl:template match="/">
    <xsl:value-of select="xfn:substringAfterLast('../../../folder1/folder2/folder3/folder4/somefile.png', '/')"/>
    <xsl:apply-templates/>
</xsl:template>

Конечно, для этого также требуется дополнительное объявление пространства имен.

0 голосов
/ 08 февраля 2012

Редактировать: это не работает, см. Комментарии

Вы можете использовать функцию substring-after для достижения этой цели.Итерируйте по link узлам, и путь будет

<xsl:variable name="lastPart" select="substring-after(text(.), '/')"/>

$lastPart, теперь будет содержать все, что находится справа от последнего / в строке.Если такого символа нет, возвращается пустая строка, поэтому вам может потребоваться дополнительная проверка для этого.

...