【问题标题】:Converting XML to another Xml using XSLT使用 XSLT 将 XML 转换为另一个 Xml
【发布时间】:2014-10-22 03:32:50
【问题描述】:

我的 xml 如下所示:

<items>
    <item id='10' name='item1'/>
    <item id='20' name='item2'/>
    <item id='30' name='item3'/>
     <item id='40' name='item4'/>
    </items>

    <parent_group>
    <parent_group_item item_id='10' parent_group_id='30'/>
    <parent_group_item item_id='20' parent_group_id='30'/>
    </parent_group>

我想用xsl把上面的代码sn-p转换成下面的格式:

  <items>
    <item>
    <id>10</id>
    <name>    item1    </name>
    <parent_group_id>30</parent_group_id>
    </item>
    <item>
    <id>20</id>
    <name>    item2    </name>
    <parent_group_id>30</parent_group_id>
    </item>
    <item>
    <id>30</id>
    <name>    item3    </name>
   
    </item>
    <item>
    <id>40</id>
    <name>    item4   </name>
   
    </item>
    </items>

您能帮我只使用 xslt 吗?我无法对任何值进行硬编码,因为这些值非常动态。

【问题讨论】:

  • 例子有点单薄。可以假设在&lt;parent_group&gt; 中找到所有必需的项目吗?您确定要丢失父项的名称吗? --- 另请注意,您的 inout 示例缺少根元素!。
  • 不,所有项目都不会是 的一部分,因为某些项目本身是独立的。是的,父项目名称在这个例子中并不重要。所以独立项目不会有其中有一个 元素。
  • "不是所有的项目都不会是 的一部分,因为有些项目是独立的。" 请发布一个示例来说明这一点。
  • 这个问题似乎离题了,因为它是关于代码请求的。
  • @torazaburo 我已经回滚了你的编辑。我认为这不是表达你的观点的正确方式。

标签: xml xslt


【解决方案1】:

假设您的输入 Xml 看起来像这样(即有一个根元素):

<xml>
    <items>
    <item id='10' name='item1'/>
    <item id='20' name='item2'/>
    <item id='30' name='itemParent'/>
    </items>

    <parent_group>
    <parent_group_item item_id='10' parent_group_id='30'/>
    <parent_group_item item_id='20' parent_group_id='30'/>
    </parent_group>
</xml>

然后您可以使用keyparent_group_item 元素中查找 item_ids

<?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"/>

    <xsl:key name="parentGroup" match="parent_group_item" use="@item_id" />

    <xsl:template match="xml/items">
        <items>
            <xsl:apply-templates select="item"></xsl:apply-templates>
        </items>
    </xsl:template>

    <xsl:template match="item">
        <item>
            <id>
                <xsl:value-of select="@id"/>
            </id>
            <name>
                <xsl:value-of select="@name"/>
            </name>
        <xsl:variable name="parentGroupKey" select="key('parentGroup', @id)" />
        <xsl:if test="$parentGroupKey">
            <parent_group_id>
                <xsl:value-of select="key('parentGroup', @id)/@parent_group_id"/>
            </parent_group_id>
        </xsl:if>
        </item>
    </xsl:template>
</xsl:stylesheet>

更新为在不匹配的情况下省略 parent_group_id 元素。

【讨论】:

  • 您应该将密钥定义为match="parent_group_item" use="@item_id"。然后使用&lt;xsl:value-of select="key('parentGroup', @id)/@parent_group_id"/&gt;获取父id值。目前,您的结果不正确。
  • @michael.hor257k 非常感谢 - 我没有对我的代码给予足够的关注。
  • 感谢 Stuart,Micahel 进行了适当的更改并修复了代码,非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多