2016-10-25 11 views
0

У меня есть XML, как это,XSLT - получить узлам один за другим

<doc> 
    <data/> 
    <books> 
     <name>abc</name> 
     <name>def</name> 
    </books> 
    <link> 
     <booklink>abc.com</booklink> 
     <booklink>def.com</booklink> 
    </link> 
</doc> 

мне нужно передать это с помощью XSLT в другой структуре,

ожидается выхода:

<doc> 
    <link ref="abc.com">abc</link> 
    <link ref="def.com">def</link> 
    <books> 
     <name>abc</name> 
     <name>def</name> 
    </books> 
    <link> 
     <booklink>abc.com</booklink> 
     <booklink>def.com</booklink> 
    </link> 
</doc> 

Я написал следующие xslt для этого,

Примечание: <booklink> может быть меньше этого числа <name>. Например, здесь может быть <booklink>. Если да, то только первый <name> должен получить ссылку. если нет <booklink>, ссылка не должна отображаться в <name>. в противном случае <booklink> следует добавить в документ заказ (позицию).

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

    <xsl:template match="data"> 
     <link ref="{xyz:get-booklink(.)}"> 
      <xsl:value-of select="xyz:get-book-name(.)"/> 
     </link> 
    </xsl:template> 


    <xsl:function name="xyz:get-book-name"> 
     <xsl:param name="node"/> 

     <xsl:sequence select="$node/(/)/doc/books/name"/> 
    </xsl:function> 


    <xsl:function name="xyz:get-booklink"> 
     <xsl:param name="node"/> 

     <xsl:sequence select="$node/(/)/doc/link/booklink"/> 
    </xsl:function> 

Но мой выходной ток,

<doc> 
    <link ref="abc.com def.com">abc def</link> 
    <books> 
     <booklink>abc</name> 
     <name>def</name> 
    </books> 
    <link> 
     <booklink>abc.com</booklink> 
     <booklink>def.com</booklink> 
    </link> 
</doc> 

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

+0

Что связывает книгу на ссылку? Это только позиция во входном XML? –

+0

@ michael.hor257k, да .. просто позиция .. если только одна ссылка доступна только в первой книге, должна получиться такая же. Если ссылки отсутствуют, книги не должны получать ссылки – sanjay

ответ

1

Я хотел бы предложить другой подход:

<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="data"> 
    <xsl:for-each select="/doc/link/booklink"> 
     <xsl:variable name="i" select="position()" /> 
     <link ref="{.}"> 
      <xsl:value-of select="/doc/books/name[$i]"/> 
     </link> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 
Смежные вопросы