XSLT中的位置字符串拆分

时间:2013-09-17 08:08:35

标签: xslt

我得到的字符串看起来像这样。

<Orders>13091711111100222222003333330044444400</Orders>

字符串的模式是这样的

13 - 09 - 17 - 11111 - 100 - 22222 - 200 - 33333 - 300 - 44444 - 400

year - Month -  day - Ordernumber1 -AMT- Ordernumber2 -AMT - Ordernumber3 -AMT - Ordernumber4 -AMT

前6个字符是固定长度(日期),后面是每个订单摘要8个字符(订单号(5个固定长度)和金额(3个固定长度)的组合)

订单数量有时可能是2或10或任何其他。

使用XSLT输出应该如下所示。

<root>
<date>130917</date>
<OrderList>
<order>
    <OrderNumber>11111</OrderNumber>
    <OrderAmount>100</OrderAmount>
</order>
<order>
        <OrderNumber>22222</OrderNumber>
    <OrderAmount>200</OrderAmount>
</order>
<order>
    <OrderNumber>33333</OrderNumber>
    <OrderAmount>300</OrderAmount>
</order>
<order>
    <OrderNumber>44444</OrderNumber>
    <OrderAmount>400</OrderAmount>
</order>

1 个答案:

答案 0 :(得分:3)

您可以使用substring

<xsl:value-of select="substring($Orders, 1, 6)" />

上面会得到日期。

现在你必须得到命令,问题是使用子字符串你必须手动执行此操作,如下所示:

<xsl:value-of select="substring($Orders, 7, 5)" />   <!-- Order number 1 -->
<xsl:value-of select="substring($Orders, 12, 3)" />  <!-- Order amount 1 -->
<xsl:value-of select="substring($Orders, 15, 5)" />  <!-- Order number 2 -->
<xsl:value-of select="substring($Orders, 20, 3)" />  <!-- Order amount 2 -->
<xsl:value-of select="substring($Orders, 23, 5)" />  <!-- Order number 3 -->
<xsl:value-of select="substring($Orders, 28, 3)" />  <!-- Order amount 3 -->
<xsl:value-of select="substring($Orders, 31, 5)" />  <!-- Order number 4 -->
<xsl:value-of select="substring($Orders, 36, 3)" />  <!-- Order amount 4 -->
<xsl:value-of select="substring($Orders, 39, 5)" />  <!-- Order number 5 -->
<xsl:value-of select="substring($Orders, 44, 3)" />  <!-- Order amount 5 -->

其次你可以在XSLT中做这样的事情:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:mypref="micorsoft.com/BizTalk/xslt">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="@*|node()">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:template>

    <xsl:template match="mypref:data">
        <root>
            <xsl:apply-templates select="@*|node()"/>
        </root>
    </xsl:template>

    <xsl:template match="mypref:Orders">
        <date>
            <xsl:value-of select="substring(., 1, 6)"/>
        </date>
        <OrderList>
            <xsl:call-template name="myOrderList">
                <xsl:with-param name="str" select="substring(., 7)" />
            </xsl:call-template>
        </OrderList>
    </xsl:template>

    <xsl:template name="myOrderList">
        <xsl:param name="str"/>
        <xsl:param name="line-length" select="9"/>

        <order>
            <OrderNumber><xsl:value-of select="substring($str, 1, 5)" /></OrderNumber>
            <OrderAmount><xsl:value-of select="substring($str, 6, 3)" /></OrderAmount>
        </order>

        <xsl:choose>
            <xsl:when test="string-length($str)&gt;$line-length">
                <xsl:call-template name="myOrderList">
                    <xsl:with-param name="str" select="substring($str,$line-length)"/>
                    <xsl:with-param name="line-length" select="$line-length"/>
                </xsl:call-template>
            </xsl:when>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>