Как установить номер позиции для каждой группы - PullRequest
1 голос
/ 28 февраля 2012

Может кто-нибудь помочь мне с этим сценарием как можно скорее?

Входной XML:

<dataXML>
<Items>
    <itemLine>
        <lineNo>1</lineNo>
        <lineRefNo>001</lineRefNo>
        <lineDes>test1</lineDes>
    </itemLine>
    <itemLine>
        <lineNo>2</lineNo>
        <lineRefNo>001</lineRefNo>
        <lineDes>test2</lineDes>
    </itemLine>
    <itemLine>
        <lineNo>3</lineNo>
        <lineRefNo>002</lineRefNo>
        <lineDes>test3</lineDes>
    </itemLine>
    <itemLine>
        <lineNo>4</lineNo>
        <lineRefNo>002</lineRefNo>
        <lineDes>test4</lineDes>
    </itemLine>
    <itemLine>
        <lineNo>5</lineNo>
        <lineRefNo>002</lineRefNo>
        <lineDes>test5</lineDes>
    </itemLine>
    <itemLine>
        <lineNo>6</lineNo>
        <lineRefNo>003</lineRefNo>
        <lineDes>test6</lineDes>
    </itemLine>
</Items>

Я перегруппировал строки позиций на основе LineRefNo

Преобразование xsl:

    <?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
    <xsl:variable name="totalLine" select="count(dataXML/Items/itemLine)" />

<Root>
    <xsl:value-of select="concat('&lt;','test','&gt;')" disable-output-escaping="yes"/>
    <xsl:for-each select="dataXML/Items/itemLine">
        <xsl:choose>
        <xsl:when test="lineRefNo != preceding-sibling::itemLine[1]/lineRefNo">
            <xsl:value-of select="concat('&lt;/','test','&gt;')" disable-output-escaping="yes"/>
            <xsl:value-of select="concat('&lt;','test','&gt;')" disable-output-escaping="yes"/>
            <item>
                <xsl:value-of select="concat('Line No : ',position())" />,<xsl:value-of select="lineRefNo" />
            </item>
            <xsl:if test="$totalLine = position()">
                <xsl:value-of select="concat('&lt;/','test','&gt;')" disable-output-escaping="yes"/>
            </xsl:if>
        </xsl:when>
        <xsl:otherwise>
            <item>
                <xsl:value-of select="concat('Line No : ',position())" />,<xsl:value-of select="lineRefNo" />
            </item>
            <xsl:if test="$totalLine = position()">
                <xsl:value-of select="concat('&lt;/','test','&gt;')" disable-output-escaping="yes"/>
            </xsl:if>
        </xsl:otherwise>
        </xsl:choose>
    </xsl:for-each>
</Root>
</xsl:template>
</xsl:stylesheet>

Примечание: Пожалуйста, избегайте '>' и '<' в преобразовании xslt, где используются теги Test и Item </p>

Он преобразует входной XML как показано ниже

 **Result :**
 <?xml version="1.0" encoding="UTF-8"?>
<Root>
    <test>
        <item>Line No : 1,001</item>
        <item>Line No : 2,001</item>
    </test>
    <test>
        <item>Line No : 3,002</item>
        <item>Line No : 4,002</item>
        <item>Line No : 5,002</item>
    </test>
    <test>
        <item>Line No : 6,003</item>
    </test>
</Root>

**Expected Result:**
<?xml version="1.0" encoding="UTF-8"?>
<Root>
    <test>
        <item>Line No : 1,001</item>
        <item>Line No : 2,001</item>
    </test>
    <test>
        <item>Line No : 1,002</item>
        <item>Line No : 2,002</item>
        <item>Line No : 3,002</item>
    </test>
    <test>
        <item>Line No : 1,003</item>
    </test>
</Root>

Заранее благодарен

1 Ответ

0 голосов
/ 28 февраля 2012

Это преобразование :

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

 <xsl:key name="kItemsByRef" match="itemLine"
  use="lineRefNo"/>

 <xsl:template match=
  "itemLine
     [generate-id()
     =
      generate-id(key('kItemsByRef', lineRefNo)[1])
     ]
  ">
  <test>
   <xsl:for-each select="key('kItemsByRef', lineRefNo)">
     <item>Line No : <xsl:value-of select=
      "concat(position(), ',', lineRefNo)"/>
      </item>
   </xsl:for-each>
  </test>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

при применении к предоставленному документу XML :

<dataXML>
    <Items>
        <itemLine>
            <lineNo>1</lineNo>
            <lineRefNo>001</lineRefNo>
            <lineDes>test1</lineDes>
        </itemLine>
        <itemLine>
            <lineNo>2</lineNo>
            <lineRefNo>001</lineRefNo>
            <lineDes>test2</lineDes>
        </itemLine>
        <itemLine>
            <lineNo>3</lineNo>
            <lineRefNo>002</lineRefNo>
            <lineDes>test3</lineDes>
        </itemLine>
        <itemLine>
            <lineNo>4</lineNo>
            <lineRefNo>002</lineRefNo>
            <lineDes>test4</lineDes>
        </itemLine>
        <itemLine>
            <lineNo>5</lineNo>
            <lineRefNo>002</lineRefNo>
            <lineDes>test5</lineDes>
        </itemLine>
        <itemLine>
            <lineNo>6</lineNo>
            <lineRefNo>003</lineRefNo>
            <lineDes>test6</lineDes>
        </itemLine>
    </Items>
</dataXML>

дает желаемый, правильный результат :

<test>
   <item>Line No : 1,001</item>
   <item>Line No : 2,001</item>
</test>
<test>
   <item>Line No : 1,002</item>
   <item>Line No : 2,002</item>
   <item>Line No : 3,002</item>
</test>
<test>
   <item>Line No : 1,003</item>
</test>
...