Возьмите значение рядом с последним в xslt

<Address>
1234Road
Unit 5 Lane
Town, City
SO1D 23Z
Customer No. 12321312312
</Address>

<Address>
21321311234Road
1234Road
Unit 5 Lane
Town, City
SO1D 23Z
Customer No. 12321312312
</Address>

Может ли кто-нибудь помочь мне всегда принимать значение почтового индекса, который всегда будет перед номером клиента?

<xsl:value-of select="substring-before(substring-after(substring-after(substring-after(Address,'&#10;'),'&#10;'),'&#10;'),'&#10;')"/>

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

Примечание: между каждой строкой есть разрывы строк (CRLF).

Любая помощь высоко ценится

 Dimitre Novatchev25 окт. 2016 г., 05:47
Посмотрите на это решение - как для XSLT 1.0, так и для XSLT 2.0:stackoverflow.com/a/7425600/36305

Ответы на вопрос(2)

следующим образом:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">

<!-- ... -->

<xsl:template match="Address">
    <xsl:variable name="tokens">
        <xsl:call-template name="tokenize">
            <xsl:with-param name="text" select="."/>
        </xsl:call-template>
    </xsl:variable>
    <postcode>
        <xsl:value-of select="exsl:node-set($tokens)/token[last() - 1]"/>
    </postcode>
</xsl:template>

<xsl:template name="tokenize">
    <xsl:param name="text"/>
    <xsl:param name="delimiter" select="'&#10;'"/>
        <xsl:variable name="token" select="substring-before(concat($text, $delimiter), $delimiter)" />
        <xsl:if test="$token">
            <token>
                <xsl:value-of select="$token"/>
            </token>
        </xsl:if>
        <xsl:if test="contains($text, $delimiter)">
            <!-- recursive call -->
            <xsl:call-template name="tokenize">
                <xsl:with-param name="text" select="substring-after($text, $delimiter)"/>
            </xsl:call-template>
        </xsl:if>
</xsl:template>

</xsl:stylesheet>
 kokos22 июл. 2016 г., 10:34
Это здорово, большое спасибо. Для взятия строки Город, Город я использовал <town> <xsl: value-of select = "exsl: node-set ($ tokens) / token [last () - 2]" /> </ town> - это хороший способ?
 michael.hor257k01 сент. 2016 г., 14:27
Если на ваш вопрос ответили, пожалуйста, закройте его, приняв ответ.
 michael.hor257k03 сент. 2016 г., 11:39
Серьезно, если на ваш вопрос ответили, пожалуйста, закройте его, приняв ответ.
 michael.hor257k22 июл. 2016 г., 11:50
Да, это. Хотя я бы определилexsl:node-set($tokens) в качестве другой переменной, если я использовал ее более одного раза.
 kjhughes30 нояб. 2016 г., 15:26
@kokos: пожалуйстапринимать этот ответ, если это помогло. Также подумайте о том, чтобы принять ответы на некоторые другие ваши прошлые вопросы - вы приняли только один из десяти, но получили гораздо больше хороших ответов. Благодарю.

ubstring-after-last» и использовать эту передачу в подстроке, которая встречается до «Customer No.»

Попробуйте это XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="text" indent="yes" />

    <xsl:template match="Address">
        <xsl:call-template name="substring-after-last">
            <xsl:with-param name="text" select="$exCust" />
            <xsl:with-param name="arg" select="'&#10;'" />
        </xsl:call-template>
    </xsl:template>

    <xsl:template name="substring-after-last">
        <xsl:param name="text" />
        <xsl:param name="arg" />

        <xsl:variable name="after" select="substring-after($text, $arg)" />
        <xsl:choose> 
            <xsl:when test="contains($after, $arg)">
                <xsl:call-template name="substring-after-last">
                    <xsl:with-param name="text" select="$after" />
                    <xsl:with-param name="arg" select="$arg" />
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$after" />
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

Если вы имеете дело только с почтовыми индексами Великобритании, длина которых варьируется от 6 до 8 символов (включая пробел), вы можете сделать это очень грубым способом ...

<xsl:variable name="exCust" select="substring-before(., '&#10;Customer No. ')" />
<xsl:value-of select="substring-after(substring($exCust, string-length($exCust) - 8, 9), '&#10;')" />

Это немного похоже на хак, и также потерпит неудачу, если предыдущий город имеет длину одного символа!

Ваш ответ на вопрос