2015-11-19 7 views
1

Я хочу, чтобы сгруппировать следующий XML-файл:Как ссылаться на сгруппированные элементы в XSLT 2.0?

<record> 
    <word>Hallo</word><translit>XUPPY</translit><gloss>gloss1</gloss> 
    <word>Bye</word><translit>EHS</translit><gloss>gloss2</gloss> 
    <word>Yes</word><translit>KGR</translit><gloss>gloss3</gloss> 
</record> 

требуемый выход

<s> 
    <set><word>Hallo</word><gloss>gloss1</gloss></set> 
    <set><word>Bye</word><gloss>gloss2</gloss></set> 
    <set><word>Yes</word><gloss>gloss3</gloss></set> 
</s> 

Поэтому я использую for-each-group, как в

<xsl:template match="record"> 
    <xsl:element name="s"> 
     <xsl:for-each-group select="*" group-starting-with="word"> 
      <xsl:element name = "set"> 
       <xsl:copy-of select="current-group()/word"/> 
       <xsl:copy-of select="current-group()/gloss"/> 
      </xsl:element> 
     </xsl:for-each-group> 
    </xsl:element> 
</xsl:template> 

Однако я получаю этот выход, т.е. , пустые группы:

<s><set/><set/><set/></s> 

Так что я делаю что-то неправильно, ссылаясь на элементы в группах. Но что? Я уверен, что это должно быть что-то простое.

ответ

3

word и gloss являются членами текущей группы, а не детей его.

Try:

<xsl:template match="/record"> 
    <s> 
     <xsl:for-each-group select="*" group-starting-with="word"> 
      <set> 
       <xsl:copy-of select="current-group()[self::word or self::gloss]"/> 
      </set> 
     </xsl:for-each-group> 
    </s> 
</xsl:template> 
+0

Да, это была точка. Благодаря! –

3

current-group() дает вам все элементы в группе, если вы хотите, чтобы выбрать определенный элемент использовать current-group()[self::gloss].

я заменил бы

 <xsl:element name = "set"> 
      <xsl:copy-of select="current-group()/word"/> 
      <xsl:copy-of select="current-group()/gloss"/> 
     </xsl:element> 

с

<set> 
    <xsl:copy-of select="., current-group()[self::gloss]"/> 
</set> 
+0

Точно. Благодаря! –