我需要一些帮助来编写xsl。
我有xml数据如下。
<Data>
<so_offer_display_value action="add">XXXX</so_offer_display_value>
<so_offer_id action="add">51005577</so_offer_id>
<so_offer_view_id action="add">3932079043</so_offer_view_id>
<so_offer_display_value action="add">YYYYY</so_offer_display_value>
<so_offer_id action="add">51005541</so_offer_id>
<so_offer_view_id action="add">3932080043</so_offer_view_id>
</Data>
我的预期输出是:
<inst>
<offerId>51005577</offerId>
<instId>3932079043</instId>
<Description>XXXX</Description>
<Action>Add</Action>
</inst>
<inst>
<offerId>51005541</offerId>
<instId>3932080043</instId>
<Description>YYYY</Description>
<Action>Add</Action>
</inst>
我正在尝试如下,但它打印相同的值两次。
<xsl:if test="/Data/so_offer_id/@action = 'add'">
<xsl:for-each select="/Data/so_offer_id">
<inst>
<offerId>
<xsl:value-of select="/Data/so_offer_id[@action='add']"/>
</offerId>
<instId>
<xsl:value-of select="/Data/so_offer_view_id[@action='add']"/>
</instId>
<Description>
<xsl:value-of select="/Data/so_offer_display_value[@action='add']"/>
</Description>
<Action>Add</Action>
<Quantity>1</Quantity>
</inst>
</xsl:for-each>
</xsl:if>
答案 0 :(得分:1)
下面是基于键的解决方案。
此解决方案的优点是Data
中的源标记可以按任何顺序排列。
第一个输出inst
标记包含具有相应名称的第一个标记。
第二个输出inst
标记包含第二个标记,依此类推。
<?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" indent="yes" omit-xml-declaration="yes"/>
<xsl:key name="tags" match="Data/*" use="name()"/>
<xsl:template match="Data">
<xsl:copy>
<xsl:for-each select="so_offer_id">
<xsl:element name="inst">
<xsl:variable name="pos" select="position()"/>
<xsl:element name="offerId">
<xsl:value-of select="."/>
</xsl:element>
<xsl:element name="instId">
<xsl:value-of select="key('tags', 'so_offer_view_id')[$pos]"/>
</xsl:element>
<xsl:element name="Description">
<xsl:value-of select="key('tags', 'so_offer_display_value')[$pos]"/>
</xsl:element>
<Action>Add</Action>
</xsl:element>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
我猜你想做:
XSLT 1.0
<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:template match="/Data">
<xsl:for-each select="so_offer_id[@action='add']">
<inst>
<offerId>
<xsl:value-of select="."/>
</offerId>
<instId>
<xsl:value-of select="following-sibling::so_offer_view_id[1]"/>
</instId>
<Description>
<xsl:value-of select="preceding-sibling::so_offer_display_value[1]"/>
</Description>
<Action>Add</Action>
<Quantity>1</Quantity>
</inst>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
假设每个商品实例具有相同的3个节点,顺序相同。
请注意,结果不是格式良好的XML文档,因为它没有单个根元素。