как использовать ELEMENT: xsl: key? - PullRequest
0 голосов
/ 22 февраля 2011

Привет всем,

Я должен сгенерировать этот XML-файл:

<document>
    <line id="0">
        <field id="0"><![CDATA[MAR5555]]></field>
        <field id="1"><![CDATA[something]]></field>
        <field id="2"><![CDATA[something]]></field>
        <field id="3"><![CDATA[something12123]]></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[444432323]]></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[032]]></field>
        <field id="17"><![CDATA[23242442]]></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[Something111]]></field>
        <field id="3"><![CDATA[something111]]></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[022]]></field>
        <field id="17"><![CDATA[23444444]]></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[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>
        <!--     For each document-->
        <line>
         <LineNumber>
          <xsl:value-of select="position()"/>
         </LineNumber>
         <LineItem>
           <xsl:value-of select="'should be fielled number of after two fields which contain symbol + '"/>
         </LineItem>
        </line>
        <!-- For each document-->
       </type-MAR>
        </xsl:template>
</xsl:stylesheet>

Я застрял, принимая номер LineItemпосле идентификатора поля, который содержит символ «+».например, если я знаю, что у 'id поля = 17' есть символ +, когда после двух строк у меня будет LineItem, и я рассчитываю, я имею в виду, если 'field id = 17' когда 'field id = 17 + 2', если 'field id= 16 'тогда' поле id = 18 'и так далее.но теперь, когда поля с символом '+' не определены, я не могу это сделать.Также, если я использую «ключ», я хочу спросить, как использовать правильный цикл «для каждого», чтобы рассчитать количество строк.Результат должен быть:

<document>
    <type-MAR>
        <document>0072972</document>
        <line>
            <LineNumber>1</LineNumber>
            <LineItem>444432323</LineItem>
        </line>
    </type-MAR>
    <type-MAR>
        <document>0000062</document>
        <line>
            <LineNumber>1</LineNumber>
            <LineItem>23242442</LineItem>
            <LineNumber>2</LineNumber>
            <LineItem>23444444</LineItem>
        </line>
    </type-MAR>
</document>

1 Ответ

0 голосов
/ 23 февраля 2011

Я решаю это самостоятельно.может быть, мой вопрос не был ясно.сначала все, чтобы найти путь к полю после номера документа, который я использую следующий брат.чтобы выбрать все необходимые LineItem, я использую «имя переменной», наконец программа выглядит:

<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">
    <xsl:variable name="doc_code" select="substring-before(field[contains(., '+')],'+')"/>
        <type-MAR>
            <document>
                <xsl:value-of select="substring-before(field[contains(., '+')],'+')"/>
            </document>
            <xsl:for-each select="//line[substring-before(field[contains(., '+')],'+')=$doc_code]">
                            <line>
                    <LineNumber>
                        <xsl:value-of select="position()"/>
                    </LineNumber>
                    <LineItem>
                    <xsl:value-of select="field[contains(., '+')]/following-sibling::field[2]"/>
                    </LineItem>
                </line>
            </xsl:for-each>
        </type-MAR>
    </xsl:template>
</xsl:stylesheet>

С уважением

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