XSLT 1.0 - рекурсивно найти комбинацию текста в значении элемента - PullRequest
0 голосов
/ 06 февраля 2011

Я не могу заставить это работать, поэтому мне нужна помощь ...

Мой xml выглядит как

<tag>PV1FEPMEDIRSPT530000030412011-04-08OC.CF.QL0000       XXR50067171277HIPAA5010TEST1470000020812011-07-13-13.25.49.846947071320112600003971A1SUPERPSA        SUPERPSA0711201107152011   085                                                                                            90                   KIYEC                                                   M1R50067171277HIPAA5010TEST1470000020812011-07-13-13.25.49.846947071320112600003971A1SUPERPSA        SUPERPSA0711201107152011   085                                                                                            50                                             XIMUK                         </tag>

Это на самом деле текстовая запись, заключенная в <tag/> элементы,

В приведенном выше значении элемента tag может быть одна или несколько записей после заголовка, который имеет 59 символов.первая позиция записи начинается в столбце 60 и продолжается до 360. Размер записи фиксированный, 300 символов.Последующие записи могут появиться после этого.

Необходимость рекурсивного чтения значения элемента в позициях 60 и 61 (или, скажем, для следующей записи 360 и 361) содержит «M1», а затем искать позицию после 221 пробела для индикатора «50».

Проверка первого индикатора 'M1' и индикатора '50' на фиксированной длине проста, но чтение следующей части строки становится затруднительным, поскольку число записей может быть до 50.

У меня есть примитивXSL, когда он соответствует только первой записи ...

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:str="http://exslt.org/strings"
    xmlns:regexp="http://exslt.org/regular-expressions"
    xmlns:exsl="http://exslt.org/common" extension-element-prefixes=" regexp str exsl"
    exclude-result-prefixes="regexp str exsl">
    <xsl:preserve-space elements="tag"/>
    <xsl:output method="text"/>
    <xsl:variable name="msg">
        <xsl:value-of select="tag/text()"/>
    </xsl:variable>
    <xsl:template match="/">        
        <xsl:call-template name="searchRecursive">
            <xsl:with-param name="msg835" select="$msg"/>
            <xsl:with-param name="m1Indicator" select="60"/>
            <xsl:with-param name="indicator" select="283"/>
        </xsl:call-template>        
    </xsl:template>
    <xsl:template name="searchRecursive">
        <xsl:param name="msg835" />
        <xsl:param name="m1Indicator"/>
        <xsl:param name="indicator"/>
        <xsl:choose>
            <xsl:when test="substring($msg835,$m1Indicator,2) = 'M1' and substring($msg835,$indicator,2) = '50'">
                **test successful**
            </xsl:when>
            <xsl:otherwise>
                <xsl:call-template name="searchRecursive">
                    <xsl:with-param name="msg835" />
                    <xsl:with-param name="m1Indicator" select="$m1Indicator + 300"/>
                    <xsl:with-param name="indicator" select="$indicator + 300"/>
                </xsl:call-template>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

Может кто-нибудь помочь мне расширить его.Спасибо!

1 Ответ

1 голос
/ 06 февраля 2011

С правильными смещениями символов эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="tag" name="search">
        <xsl:param name="pRecordIndex" select="55"/>
        <xsl:param name="pStringLength" select="string-length()"/>
        <xsl:choose>
            <xsl:when test="$pRecordIndex > $pStringLength"/>
            <xsl:when test="substring(.,$pRecordIndex,2) = 'M1'
                            and
                            substring(.,$pRecordIndex + 223,2) = '50'">
                <xsl:text>**test successful**</xsl:text>
            </xsl:when>
            <xsl:otherwise>
                <xsl:call-template name="search">
                    <xsl:with-param name="pRecordIndex"
                                    select="$pRecordIndex + 300"/>
                    <xsl:with-param name="pStringLength"
                                    select="$pStringLength"/>
                </xsl:call-template>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

Выход:

**test successful**

Примечание : Ваш ввод имеет заголовок 54 символов.

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