2016-07-21 2 views
0
<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> 

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

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

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

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

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

+1

Посмотрите на это решение - как для XSLT 1.0, так и для XSLT 2.0: http://stackoverflow.com/a/7425600/36305 –

ответ

1

Это довольно утомительно в XSLT 1.0 - я предлагаю вам попробовать его вдоль этих линий:

<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> 
+0

Это очень большое спасибо. Для взятия города, линии города я использовал - это хороший способ? – kokos

+0

Да, это так. Хотя я бы определил 'exsl: node-set ($ tokens)' как другую переменную, если я использовал ее более одного раза. –

+1

Если на ваш вопрос ответили, пожалуйста, закройте его, приняв ответ. –

2

Одним из возможных способов является создание рекурсивный «подстрока-после- последний»именованный шаблон, а также использовать, что передача в подстроке, которая возникает перед„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;')" /> 

Это бит взлома, хотя и будет неудачным, если предыдущий город - один символ в длину!