Токенизация строки в буквальном слэше - PullRequest
0 голосов
/ 24 июня 2019

У меня есть следующий код для установки атрибута XSL id для якорной ссылки:

        <xsl:attribute name="id">
            <xsl:variable name="articleUrl" select="concat(substring-before(substring-after(substring-after(document/documentinfo/uri/@path,$ps-group-path), 'content'),'psml'),'html')" as="xs:string*"/>
            <xsl:variable name="articleArr" select="tokenize($articleUrl,'//')" />
            <xsl:variable name="articleIndex" select="count($articleArr)" as="xs:integer" />
            <xsl:value-of select="$articleArr[$articleIndex]" as="xs:string" />
        </xsl:attribute>

Значение select в первом xsl:variable в этом случае составляет /news/2018/AT04651-article.html. Я хочу разделить articleUrl по буквальному слэшу /, а затем выполнить еще один mumbo jumbo с массивом, чтобы извлечь последнюю часть массива (AT04651-article.html), а затем в конечном итоге отрубить часть -article.html до получить доступ к значению AT04651 ...

Единственная проблема на данный момент заключается в том, что когда я попытался токенизировать строку через косую черту, значение, возвращаемое значением id, я в итоге получил исходную строку, /news/2018/AT04651-article.html в настоящее время не AT04651-article.html, и значение $articleIndex возвращается как 1 ... как будто функция tokenize не работает ... Может кто-нибудь сказать мне, где я ошибся?

В этом случае я работаю с XSLT 2.0 ...

1 Ответ

1 голос
/ 24 июня 2019

Если вы хотите разбить строку на одну буквальную косую черту, почему вы токенизируете на двойную косую черту?Я думаю, что если вы измените это, то решите свою проблему.

Я проверил жесткое кодирование введенной вами входной переменной, а затем просто выводил каждый элемент после токенизации вместе с его индексом.

Код

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output indent="yes" method="xml"/>

    <xsl:template match="/">
        <items>
            <xsl:variable name="articleUrl" select="'/news/2018/AT04651-article.html'" />
            <xsl:variable name="articleArr" select="tokenize($articleUrl,'/')" />
            <xsl:variable name="articleIndex" select="count($articleArr)"  />
            <xsl:for-each select="$articleArr">
                <item index="{position()}"><xsl:value-of select="." /></item>
            </xsl:for-each>
        </items>
    </xsl:template>

</xsl:stylesheet>

Выход

<?xml version="1.0" encoding="UTF-8"?>
<items>
   <item index="1"/>
   <item index="2">news</item>
   <item index="3">2018</item>
   <item index="4">AT04651-article.html</item>
</items>
...