У меня есть 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 и имя по одному .. любое предложение, как я могу это сделать?
Что связывает книгу на ссылку? Это только позиция во входном XML? –
@ michael.hor257k, да .. просто позиция .. если только одна ссылка доступна только в первой книге, должна получиться такая же. Если ссылки отсутствуют, книги не должны получать ссылки – sanjay