如何将输入xml分解为令牌并读取令牌值

时间:2016-07-09 14:42:24

标签: xslt-2.0

以下是xslt的输入

<docValues>
01|1596056|CCCCCCCCCDD|028571|ABCCHAS|29150699|150800|FFSSSSFFFF|005| |N|N|002| | |0000020319|29150699|163000|29150699|153100|666666|20140627|400|RRRRR|400| |20150701
02|1596056|028571|29150699|0001|400| | |0001|THIS IS MY SERVICE,,| | | |0901.99| |0.5| 
03|1596056|028571|29150699|0001|5103|29150699|29150699| |1.000|99.098| | 
<docValues>

Below are the details of xml input
    01 : First Line Number
    02 : Second Line Number
    03 : Third Line Number

XSLT应该读取xml

下的输入xml和outout
<SO>
    <line01_2nd_token>1596056</line01_2nd_token>
    <line01_4th_token>028571</line01_4th_token>
    <line01_5th_token>ABCCHAS</line01_4th_token>
<SO>
<PARIS>
    <line01_4th_token>028571</line01_4th_token>
    <line02_5th_token>0001</line02_5th_token>
    <line03_11th_token>99.098</line03_11th_token>
</PARIS>
<MY_SERVICE>
    <line01_4th_token>028571</line01_4th_token>
    <line03_5th_token>0001</line02_5th_token>
    <line02_6th_token>400</line02_6th_token>
</MY_SERVICE>

要实现上述输出:输入xml中的行(01,02,03)需要分解为令牌作为分隔符,以便我可以在相应的行(01,02,03)中读取所需的标记值

所以我的问题是如何将输入xml分解为令牌并读取令牌值。

有没有办法实现所需的输出

请帮我解决这个问题

1 个答案:

答案 0 :(得分:0)

好吧,有一个函数tokenize可以使用两次,首先使用第二个参数'\r?\n'来查找行,然后你可以对'\|'上的每一行进行标记。

这是一个提取一些令牌的示例,您应该能够自己完成:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:output indent="yes"/>

    <xsl:template match="docValues">
        <xsl:variable name="lines" select="tokenize(., '\r?\n')[normalize-space()]"/>
        <xsl:variable name="line1-tokens" select="tokenize($lines[1], '\|')"/>
        <SO>
            <line01_2nd_token><xsl:value-of select="$line1-tokens[2]"/></line01_2nd_token>
        </SO>
        <PARIS>
            <line01_4th_token><xsl:value-of select="$line1-tokens[4]"/></line01_4th_token>
        </PARIS>
        <MY_SERVICE>
            <line01_4th_token><xsl:value-of select="$line1-tokens[4]"/></line01_4th_token>
        </MY_SERVICE>
    </xsl:template>
</xsl:stylesheet>