2015-02-12 7 views
0

Вот пример XML.XSLT 1.0 выберите элементы в Quiz XML

<Root> 
    <Story> 
    <body> 
     <quiz>1</quiz>How to select that rightanswer from another Story ? 
    </body> 
    <answer>answer1-1</answer> 
    <answer>answer1-2</answer> 
    <answer>answer1-3</answer> 
    <body> 
     <quiz>2</quiz>And how to push these <qitem/>s into <qitems/> ? 
    </body> 
    <answer>answer2-1</answer> 
    <answer>answer2-2</answer> 
    <answer>answer2-3</answer> 
    <answer>answer2-4</answer> 
    </Story> 
    <Story> 
    <h3>RIGHT_ANSWERS</h3> 
    <rightanswer> 
     RightAnswer1 IDK 
    </rightanswer> 
    <rightanswer> 
     RightAnswer2 IDK 
    </rightanswer> 
    </Story> 
</Root> 

Ожидаемый результат:

<Root> 
    <Story> 
     <quiz> 
      <qitems> 
       <qitem> 
        <question> 
         <qtitle>1</qtitle> 
         <qtext>How to select that rightanswer from another Story ?</qtext> 
        </question> 
        <answers> 
         <answer>answer1-1</answer> 
         <answer>answer1-2</answer> 
         <answer>answer1-3</answer> 
        </answers> 
        <rightanswer>RightAnswer1 IDK</rightanswer> 
       </qitem> 
       <qitem> 
        <question> 
         <qtitle>2</qtitle> 
         <qtext>And how to push these <qitem/>s into <qitems/> ?</qtext> 
        </question> 
        <answers> 
         <answer>answer2-1</answer> 
         <answer>answer2-2</answer> 
         <answer>answer2-3</answer> 
         <answer>answer2-4</answer> 
        </answers> 
        <rightanswer>RightAnswer2 IDK</rightanswer> 
       </qitem> 
      </qitems> 
     </quiz> 
    </Story> 
</Root> 

Все, что я смог сделать, это положить каждый body[quiz] и следующим его брат и сестра по имени answer в <qitem> элемент и застрял на толкая эти <qitem>s в родителю <qitems> и выбор <rightanswer>. До сих пор у меня есть этот XSL:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" /> 
    <xsl:strip-space elements="*" /> 
    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="body[quiz]" > 
     <qitem> 
      <question>   
       <qtitle> 
        <xsl:value-of select="quiz" /> 
       </qtitle> 
       <qtext> 
        <xsl:apply-templates select="node()" /> 
       </qtext> 
      </question> 
      <answers> 
       <xsl:apply-templates select="following-sibling::*[1][self::answer]" mode="following" /> 
      </answers> 
      <rightanswer></rightanswer> 
     </qitem> 
    </xsl:template> 
    <xsl:template match="answer" mode="following"> 
     <answer> 
      <xsl:apply-templates select="node()" /> 
     </answer> 
     <xsl:apply-templates select="following-sibling::*[1][self::answer]" mode="following" /> 
    </xsl:template> 

    <xsl:template match="body/quiz" /> 
    <xsl:template match="answer" /> 
    <xsl:template match="h3"/> 
</xsl:stylesheet> 

Проверьте это: http://xsltransform.net/nc4NzQr

ответ

1

Если можно предположить, что Root элемент всегда содержит ровно 2 Story элементов, один с Q & Как и один с правильным ответы, то вы могли бы сделать просто:

XSLT 1,0

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="Story[1]"> 
    <qitems> 
     <xsl:apply-templates select="body"/> 
    </qitems> 
</xsl:template> 

<xsl:template match="body"> 
    <xsl:variable name="i" select="position()" /> 
    <qitem> 
     <question>   
      <qtitle> 
       <xsl:value-of select="quiz" /> 
      </qtitle> 
      <qtext> 
       <xsl:apply-templates/> 
      </qtext> 
     </question> 
     <answers> 
      <xsl:apply-templates select="following-sibling::answer[1]" mode="following"/> 
     </answers> 
     <xsl:apply-templates select="following::Story/rightanswer[$i]"/> 
    </qitem> 
</xsl:template> 

<!-- sibling recursion -->  
<xsl:template match="answer" mode="following"> 
    <answer> 
     <xsl:apply-templates/> 
    </answer> 
    <xsl:apply-templates select="following-sibling::*[1][self::answer]" mode="following" /> 
</xsl:template> 

<xsl:template match="Story[2]" /> 
<xsl:template match="quiz" /> 

</xsl:stylesheet> 

застрял на продвижение этих <qitem> сек в родитель <qitems>

Я не мог понять, почему вам нужен <qitems> обертку и что она представляет; мне кажется, что у вас уже слишком много элементов оболочки в запрошенном выпуске. В приведенном выше примере я сделал <qitems> представителем родителя Story и удалил обертку Story.

+0

Отлично! Благодаря! Оно работает. Эти избыточные обертки необходимы, чтобы преобразовать их дальше в XHTML. Еще раз спасибо. – sprut