Использование XSL для получения всех тегов до появления тега с заданным содержимым - PullRequest
1 голос
/ 22 февраля 2011

Может быть, кто-нибудь посоветует мне, как исправить эту программу.Я должен взять из поля номер до +.Иногда это поле находится на 17-й строке (идентификатор поля 17), иногда 14, 19 и т. Д. Другие поля также заполняются.Прямо сейчас моя программа берет это число из идентификатора поля 17. Как это исправить?

Пример данных:

<document>
    <line id="0">
        <field id="0"><![CDATA[MAR5555]]></field>
        <field id="1"><![CDATA[12314124141241]]></field>
        <field id="2"><![CDATA[AAS]]></field>
        <field id="3"><![CDATA[FOR12312]]></field>
        <field id="4"/>
        <field id="5"/>
        <field id="6"/>
        <field id="7"/>
        <field id="8"/>
        <field id="9"/>
        <field id="10"/>
        <field id="11"/>
        <field id="12"/>
        <field id="13"/>
                <field id="14"/>
                <field id="15"/>
                <field id="16"/>
        <field id="17"><![CDATA[0072972+1313113123123]]></field>
        <field id="18"><![CDATA[5353]]></field>
        <field id="19"><![CDATA[444444]]></field>
        <field id="20"/>
        <field id="21"/>
    </line>
    <line id="1">
        <field id="0"><![CDATA[MAR6435]]></field>
        <field id="1"><![CDATA[car123]]></field>
        <field id="2"><![CDATA[sds]]></field>
        <field id="3"><![CDATA[fest]]></field>
        <field id="4"/>
        <field id="5"/>
        <field id="6"/>
        <field id="7"/>
        <field id="8"/>
        <field id="9"/>
        <field id="10"/>
        <field id="11"/>
        <field id="12"/>
        <field id="13"/>
        <field id="14"/>
        <field id="15"><![CDATA[0000062+0dadasd]]></field>
        <field id="16"><![CDATA[0d2]]></field>
        <field id="17"><![CDATA[cccc]]></field>
        <field id="18"/>
        <field id="19"><![CDATA[000000]]></field>
        <field id="20"/>
        <field id="21"/>
    </line>
    <line id="2">
        <field id="0"><![CDATA[MAR6435]]></field>
        <field id="1"><![CDATA[sss]]></field>
        <field id="2"><![CDATA[1231231]]></field>
        <field id="3"><![CDATA[45123]]></field>
        <field id="4"/>
        <field id="5"/>
        <field id="6"/>
        <field id="7"/>
        <field id="8"/>
        <field id="9"/>
        <field id="10"/>
        <field id="11"/>
        <field id="12"/>
        <field id="13"/>
        <field id="14"/>
        <field id="15"><![CDATA[0000062+0sdsd]]></field>
        <field id="16"><![CDATA[0f2]]></field>
        <field id="17"><![CDATA[843252dsd]]></field>
        <field id="18"/>
        <field id="19"><![CDATA[000000]]></field>
        <field id="20"/>
        <field id="21"/>
    </line> 
</document>

Пример моей программы:

 <xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
        <xsl:key name="kLine" match="line" use="substring-before(field[@id='17'],'+')"/>
        <xsl:template match="/*">
            <document>
                <xsl:apply-templates select="line[contains(field[@id='0'], 'MAR')][count(. | key('kLine', substring-before(field[@id='17'],'+'))[1]) = 1]"/> 
            </document>
        </xsl:template>
        <xsl:template match="line">
            <type-MAR>
                <document>
                    <xsl:value-of select="substring-before(field[@id='17'],'+')"/> 
                </document>
            </type-MAR>
        </xsl:template>
    </xsl:stylesheet>

Результат:

<type-MAR>
 <document>
      0072972
 </document>
 <document>
      0000062          
 </document>
</type-MAR>

1 Ответ

3 голосов
/ 22 февраля 2011
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    <xsl:key name="kLine" match="line" use="
        substring-before(
            field[contains(., '+')]
            ,'+'
            )"/>
    <xsl:template match="/*">
        <document>
            <xsl:apply-templates select="
            line
                [contains(field[@id='0'], 'MAR')]
                [count(
                    . | key(
                        'kLine',
                        substring-before(
                            field[contains(., '+')]
                            ,'+')
                            )
                        [1]
                        ) = 1
                ]"/>
        </document>
    </xsl:template>
    <xsl:template match="line">
        <type-MAR>
            <document>
                <xsl:value-of select="
                    substring-before(
                        field[contains(., '+')],
                        '+'
                        )
                    "/>
            </document>
        </type-MAR>
    </xsl:template>
</xsl:stylesheet>

Правильно сформированный вывод XML для вашего образца:

<document>
    <type-MAR>
        <document>0072972</document>
    </type-MAR>
    <type-MAR>
        <document>0000062</document>
    </type-MAR>
</document>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...