【发布时间】:2012-07-07 07:44:02
【问题描述】:
我试图使用 XSLT 对 XML 进行多次传递转换到另一个 xml。但无法实现。感谢代码提供帮助。
如果没有元素匹配并且@DimitreNovaatchev 提供的 muenchian 分组,我已经制定了解决方案。在这种情况下,“” Car_MNO, Car_Model “”被匹配,然后其他值被分组。
Input XML:
<t>
<Vehicle>
<Car_MNo>123</Car_MNo>
<Car_Model>Audi</Car_Model>
<Description>car.color</Description>
<colour>BLACK</colour>
</Vehicle>
<Vehicle>
<Car_MNo>123</Car_MNo>
<Car_Model>Audi</Car_Model>
<Description>car.hood</Description>
<colour>RED</colour>
</Vehicle>
<Vehicle>
<Car_MNo>123</Car_MNo>
<Car_Model>BMW</Car_Model>
<Description>Bus.Brakes</Description>
<colour>steel</colour>
</Vehicle>
<Vehicle>
<Car_MNo>123</Car_MNo>
<Car_Model>BMW</Car_Model>
<Description>Bus.steering</Description>
<colour>black</colour>
</Vehicle>
<Vehicle>
<Car_MNo>234</Car_MNo>
<Car_Model>benz</Car_Model>
<Description>cycle.color</Description>
<colour>violet</colour>
</Vehicle>
<Vehicle>
<Car_MNo>345</Car_MNo>
<Car_Model>nissan</Car_Model>
<Description>bike.seat</Description>
<colour>RED</colour>
</Vehicle>
<Vehicle>
<Car_MNo>345</Car_MNo>
<Car_Model>nissan</Car_Model>
<Description>car</Description>
<colour>RED</colour>
</Vehicle>
</t>
XML 中的预期输出:
<t>
<Vehicle>
<car>
<color>BLACK</color>
<hood>RED</hood>
</car>
<Bus>
<Brakes>steel</Brakes>
<Steering>black</Steering>
</Bus>
<cycle>
<color>violet</color>
</cycle>
<bike>
<seat>Red</seat>
</bike>
</Vehicle>
<vehicle>
<car>red</car>
</vehicle>
</t>
我工作的示例代码如下所示:
<Vehicle>
<xsl:variable name="vrtfPass2">
<xsl:apply-templates/>
</xsl:variable>
<xsl:apply-templates mode="pass3" select="ext:node-set($vrtfPass2)/* [generate-id()=generate- id(key('kvehiclechild', name(Name/*[1]))[1])] "/>
<xsl:for-each select="//Vehicle">
<xsl:if test="not(contains(Description,'.'))">
<xsl:variable name="var3" select="Description"/>
<xsl:element name="{$var3}">
<xsl:value-of select="colour"/>
</xsl:element>
</xsl:if>
</xsl:for-each>
</Vehicle>
<Vehicle>
<xsl:variable name="vrtfPass3">
<xsl:apply-templates/>
</xsl:variable>
<xsl:apply-templates mode="pass4" select="ext:node-set($vrtfPass3)/* [generate-id()= generate- id(key('kvehicle_au', name(Description/*[1]))[1])] "/>
</Vehicle>
<xsl:template match="Vehicle">
<Vehicle>
<car>
<xsl:if test="contains(Description,'.')">
<xsl:element name="{concat(substring-before(Description, '.'),substring-after (Profile, ' '))}">
<xsl:element name="{substring-after(Description, '.')}">
<xsl:value-of select="Value"/>
</xsl:element>
</xsl:element>
</xsl:if>
</car>
</Vehicle>
</xsl:template>
<xsl:template match="Vehicle" mode="pass3">
<xsl:apply-templates select="*/*[1]" mode="pass3"/>
</xsl:template>
【问题讨论】:
-
该元素没有特定含义。我无法解释它的具体含义。相反,我将解释我感兴趣的主题。请记住我之前提出的问题是 2 遍转换的问题。现在我有兴趣通过比较“
, ”来获取输出,如果它们都匹配,那么输出必须通过分组显示。如果不匹配,它们必须在单独的元素中。我已经尝试过了,我得到了将相似元素分组为一个的输出,但另一个没有正确的期望输出。 -
Ramana:为什么结果中有两个
Vehicle元素?这没有解释,似乎不正确/任意。 -
我制作了两个 Vehicle 元素,因为“当您检查输入的 xml 文件时,如果元素 "
, " 匹配,则元素将进行 2 次转换并合并到一个单一的元素。“如果假设他们不匹配,他们将被分开”,因为您提供给我的结果是真实的。但是如果他们不匹配并且我有一个带有“否”的元素。 " 那么第二个 Vehicle 元素应该有结果。 -
@Dimitre:作为一个学习的开发者......应该在发布时提供准确的结果。是我的错。我真诚地道歉。
-
Ramana,对不起,但你的最后一个解释听起来甚至不像有意义的英语。这里有四种不同的车型:奥迪、宝马、奔驰和尼桑——您是如何决定只生成两个
Vehicle元素的?这是不合逻辑的和完全的谜。我强烈建议您回滚对原始问题的更改,然后用您的新问题提出一个新问题。您必须解释想要的结果背后的逻辑 - 以便人们能够理解这个解释。
标签: xml xslt xml-serialization xml-parsing