2013-03-22 4 views
-1

У меня есть несколько элементов данных строк в моем XML, как это -Ряд данных в XSL 1.0

<ROW TYPE="SPECIFICATION" ID="1"> 
    <R1>English1</R1> 
</ROW> 
<ROW TYPE="SPECIFICATION" ID="1"> 
    <R1>Maths1</R1> 
</ROW> 
<ROW TYPE="TOTAL" ID="1"> 
    <R1>Code1</R1> 
</ROW> 
<ROW TYPE="SPECIFICATION" ID="2"> 
    <R1>English2</R1> 
</ROW> 
<ROW TYPE="SPECIFICATION" ID="2"> 
    <R1>Maths2</R1> 
</ROW> 
<ROW TYPE="TOTAL" ID="2"> 
    <R1>Code2</R1> 
</ROW> 
<ROW TYPE="MAIN" ID="3"> 
    <R1>Code3</R1> 
</ROW> 
<ROW TYPE="SPECIFICATION" ID="4"> 
    <R1>English4</R1> 
</ROW> 
<ROW TYPE="TOTAL" ID="4"> 
    <R1>Code4</R1> 
</ROW> 

Я хочу, чтобы мой выход, который будет отображаться в изображения, как это работает эта строка данных в обмен на каждом цикле. И требование состоит в том, что сначала должен отображаться ROW TYPE = «TOTAL» ID = «1», а затем его данные ROW TYPE = «SPECIFICATION». Повторное перемещение в цикле снова должно отображаться ROW TYPE = «TOTAL» ID = «2», а затем его данные ROW TYPE = «SPECIFICATION». IF ROW_TYPE отличается (может быть что угодно), тогда он должен появляться как в последовательности. Он специфичен только для SPECIFICATION и TOTAL.

В принципе, он должен прийти, как это -

Code1 
    English1 
    Maths1 
Code2 
    English2 
    Maths2 
Code3 
Code4 
    English4 

Код XSLT работает для последовательности, как и для каждого цикла-работ. Но мне нужно сначала перенести строку TOTAL для этого идентификатора. Пожалуйста, предложите логику для этого.

+0

Разве это не дубликат http://stackoverflow.com/questions/15539332/shifting-row-data-in-xsl-1-0? –

+0

Если вы видите, это небольшое изменение в этом XML. Ранее логика была специфичной для двух типов данных ROW. Теперь данные меняются. – Kundan

+0

Итак, если у вас есть '' (я сокращаю R1 для краткости), как их следует упорядочить в результате? – JLRishe

ответ

0

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

<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="kRowById" 
     match="ROW[not(@TYPE='TOTAL' or @TYPE='MAIN')]" 
     use="@ID"/> 

<xsl:template match="ROW[@TYPE='TOTAL' or @TYPE='MAIN']"> 
    <xsl:copy-of select="."/> 
    <xsl:copy-of select="key('kRowById', @ID)"/> 
</xsl:template> 
<xsl:template match="text()"/> 
</xsl:stylesheet> 

при нанесении на документе XML (полученного из предоставленного фрагмента XML, окружив его в один верхний элемент):

<t> 
    <ROW TYPE="SPECIFICATION" ID="1"> 
     <R1>English1</R1> 
    </ROW> 
    <ROW TYPE="SPECIFICATION" ID="1"> 
     <R1>Maths1</R1> 
    </ROW> 
    <ROW TYPE="TOTAL" ID="1"> 
     <R1>Code1</R1> 
    </ROW> 
    <ROW TYPE="SPECIFICATION" ID="2"> 
     <R1>English2</R1> 
    </ROW> 
    <ROW TYPE="SPECIFICATION" ID="2"> 
     <R1>Maths2</R1> 
    </ROW> 
    <ROW TYPE="TOTAL" ID="2"> 
     <R1>Code2</R1> 
    </ROW> 
    <ROW TYPE="MAIN" ID="3"> 
     <R1>Code3</R1> 
    </ROW> 
    <ROW TYPE="SPECIFICATION" ID="4"> 
     <R1>English4</R1> 
    </ROW> 
    <ROW TYPE="TOTAL" ID="4"> 
     <R1>Code4</R1> 
    </ROW> 
</t> 

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

<ROW TYPE="TOTAL" ID="1"> 
    <R1>Code1</R1> 
</ROW> 
<ROW TYPE="SPECIFICATION" ID="1"> 
    <R1>English1</R1> 
</ROW> 
<ROW TYPE="SPECIFICATION" ID="1"> 
    <R1>Maths1</R1> 
</ROW> 
<ROW TYPE="TOTAL" ID="2"> 
    <R1>Code2</R1> 
</ROW> 
<ROW TYPE="SPECIFICATION" ID="2"> 
    <R1>English2</R1> 
</ROW> 
<ROW TYPE="SPECIFICATION" ID="2"> 
    <R1>Maths2</R1> 
</ROW> 
<ROW TYPE="MAIN" ID="3"> 
    <R1>Code3</R1> 
</ROW> 
<ROW TYPE="TOTAL" ID="4"> 
    <R1>Code4</R1> 
</ROW> 
<ROW TYPE="SPECIFICATION" ID="4"> 
    <R1>English4</R1> 
</ROW> 

Update:

По просьбе ОП в комментариях, если значение, отличное от «СПЕЦИФИКАЦИИ» должно быть поставлено во главе группы, используйте этот код:

<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="kRowById" 
     match="ROW[not(@TYPE='TOTAL' or @TYPE='MAIN')]" 
     use="@ID"/> 

<xsl:template match="ROW[not(@TYPE='SPECIFICATION')]"> 
    <xsl:copy-of select="."/> 
    <xsl:copy-of select="key('kRowById', @ID)"/> 
</xsl:template> 
<xsl:template match="text()"/> 
</xsl:stylesheet> 
+0

Любое предложение о том, содержит ли ROW_TYPE значение, которое может быть любым, что неизвестно или какие данные поступают во входной файл. – Kundan

+0

@Kundan, не может быть предположение, если не указано, что должно быть сделано в таком случае ... –

+0

Означает ли это, что если мы не знаем, какие данные поступают от клиента в ROW_TYPE, мы не можем отображать как мы это делаем сейчас. ROW_TYPE должен быть всегда известен первым? – Kundan

Смежные вопросы