XSLT разделить одно длинное строковое значение, разделенное запятой - PullRequest
0 голосов
/ 02 июня 2019

У меня есть входной XML, который имеет это

<BankStatementAccount>
    <Line>
        <Data>TEST,,TEST,,,</Data>
    </Line>
    <Line>
        <Data>,,,,,</Data>
    </Line>
    <Line>
        <Data>Account:,TEST,TEST,,,</Data>
    </Line>
    <Line>
        <Data>,,,,,</Data>
    </Line>
    <Line>
        <Data>Payment Date:,1/5/2019,,,,</Data>
    </Line>
    <Line>
        <Data>,,,,,</Data>
    </Line>
    <Line>
        <Data>Payment No:,123456,,,,</Data>
    </Line>
    <Line>
        <Data>,,,,,</Data>
    </Line>
    <Line>
        <Data>11/01/19,crnote,088-543215432,(48.47),(3.39),(45.08)
        </Data>
    </Line>
    <Line>
        <Data>05/02/19,crnote,033-123456789,(10.09),(0.71),(9.38)
        </Data>
    </Line>
    <Line>
        <Data>,,,,,</Data>
    </Line>
    <Line>
        <Data>,,Amount Paid,"133,654.70","9,356.10 ","124,298.60 "
        </Data>
    </Line>
    <Line>
        <Data>,,,,,</Data>
    </Line>
</BankStatementAccount>

Каждое <Line> строковое значение имеет 6 значений данных, разделенных 5 запятыми. Мне нужно иметь возможность разделить их на отдельные теги.

Чтобы выглядеть примерно так:

От: <Line>05/02/19,cr note,033-123456789,(10.09),(0.71),(9.38)</Line>

Кому:

<Line> 
    <tag1>05/02/19</tag1>
    <tag2>cr note</tag2>
    <tag3>033-123456789</tag3>
    <tag4>(10.09)</tag4>
    <tag5>(0.71)</tag5>
    <tag6>(9.38)</tag6>
</Line>

Я пытался,

<BankStatementAccount>
    <xsl:for-each select="BankStatementAccount/Line">
        <Line>
            <xsl:value-of select="Data" />
            <xsl:variable name="var" select="substring(.,1,8)" />
            <tag1><xsl:value-of select="$var[1]" /></tag1>
            <!-- and $var[2].. so on.. -->
        </Line>
    </xsl:for-each>
</BankStatementAccount>

но я продолжаю получать эту ошибку

FATAL ERROR: 'Ошибка проверки типа выражения 'filter-expr (variable-ref (var / string), [pred (int-expr (1))])'. '

Я попробовал подстроку (., 1,8) сначала посмотреть, получу ли я символы с позиции 1 - 8, но я не могу запустить это.

Буду признателен за любую помощь.

Спасибо.

1 Ответ

0 голосов
/ 02 июня 2019

Если вы можете использовать процессор, поддерживающий XSL 2.0, попробуйте что-то вроде:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="Line">
    <xsl:copy>
        <xsl:for-each select="tokenize(Data, ',')">
            <xsl:element name="tag{position()}">
                <xsl:value-of select="."/>
            </xsl:element>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...