我正在开发一个xsl,它使用XSLT将输入xml转换为其他xml,如下所述。
逻辑:在输入xml中,我在“Vehicle”中提到了四个子元素“vehicle_No,vehicle_Model,Description,color”。我想得到一个结果“if”vehicle_No,vehicle_Model“与下一个”车辆“匹配,那么”description“中的值应该成为元素,然后输出应该看起来像...,同时Muenchian分组为”描述“时“vehicle_No,vehicle_Model”匹配,
样品O / P:如果匹配
<vehicle>
<car>
<color>BLACK</color>
<hood>RED</hood>
</car>
</vehicle>
如果不匹配
<vehicle>
<car>
<color>BLACK</color>
<hood>RED</hood>
</car>
<cycle>
<color>violet</color>
</cycle>
</vehicle>
如果我输入xml中提到的“description”的值相同,则“vehicle_No,vehicle_Model”不匹配。然后o / p应该看起来像
<vehicle>
<car>
<color>BLACK</color>
<hood>RED</hood>
</car>
<cycle>
<color>violet</color>
</cycle>
</vehicle>
<vehicle>
<car>
<color>RED</color>
</car>
</vehicle>
我的输入XML文件:
<t>
<Vehicle>
<vehicle_No>123</vehicle_No>
<vehicle_Model>Audi</vehicle_Model>
<Description>car.color</Description>
<colour>BLACK</colour>
</Vehicle>
<Vehicle>
<vehicle_No>123</vehicle_No>
<vehicle_Model>Audi</vehicle_Model>
<Description>car.hood</Description>
<colour>RED</colour>
</Vehicle>
<Vehicle>
<vehicle_No>123</vehicle_No>
<vehicle_Model>BMW</vehicle_Model>
<Description>Bus.Brakes</Description>
<colour>steel</colour>
</Vehicle>
<Vehicle>
<vehicle_No>123</vehicle_No>
<vehicle_Model>BMW</vehicle_Model>
<Description>Bus.steering</Description>
<colour>black</colour>
</Vehicle>
<Vehicle>
<vehicle_No>234</vehicle_No>
<vehicle_Model>benz</vehicle_Model>
<Description>cycle.color</Description>
<colour>violet</colour>
</Vehicle>
<Vehicle>
<vehicle_No>345</vehicle_No>
<vehicle_Model>nissan</vehicle_Model>
<Description>car.color</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>
</Vehicle>
<vehicle>
<car>
<color>RED</color>
</car>
</vehicle>
</t>
如果问题不清楚,请告诉我。
答案 0 :(得分:1)
这个XSLT 1.0样式表...
<?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="vehicle-by-number" match="Vehicle" use="vehicle_No" />
<xsl:key name="vehicle-by-form" match="Vehicle" use="
concat( vehicle_No, '-', substring-before(Description,'.'))" />
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates select="Vehicle[
generate-id(.) = generate-id(key('vehicle-by-number',vehicle_No)[1])]"
mode="vehicle-group" />
</xsl:copy>
</xsl:template>
<xsl:template match="Vehicle" mode="vehicle-group">
<xsl:copy>
<xsl:apply-templates select="key('vehicle-by-number',vehicle_No)
[generate-id(.) = generate-id(key('vehicle-by-form',
concat( vehicle_No, '-', substring-before(Description,'.')))[1])]"
mode="form-group" />
</xsl:copy>
</xsl:template>
<xsl:template match="Vehicle" mode="form-group">
<xsl:element name="{substring-before(Description,'.')}">
<xsl:for-each select="key('vehicle-by-form',concat( vehicle_No, '-', substring-before(Description,'.')))">
<xsl:element name="{substring-after(Description,'.')}">
<xsl:value-of select="colour" />
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
...当应用于您的样本输入时,将生成...
<?xml version="1.0" encoding="utf-8"?>
<t>
<Vehicle>
<car>
<color>BLACK</color>
<hood>RED</hood>
</car>
<Bus>
<Brakes>steel</Brakes>
<steering>black</steering>
</Bus>
</Vehicle>
<Vehicle>
<cycle>
<color>violet</color>
</cycle>
</Vehicle>
<Vehicle>
<car>
<color>RED</color>
</car>
</Vehicle>
</t>
虽然这与您列出的预期输出不完全匹配,但我认为差异是由于您列出的预期输出中的错误。我特别提到了值为'violet'的节点的位置。
此样式表使用2级muenchian分组。第一级足够直截了当。它将所有车辆组合在一起,在具有相同车辆编号的一个输出车辆元件下。在muenchian的SO中的大多数示例中,for-each用于遍历组成员,而我使用了apply-templates。它完全相同。
我有第二个键(逐个表格),用于第二级分组。通过'形式',我的意思是汽车,公共汽车,自行车等。这个关键字分组车辆编号和形式。车辆分组在以表格命名的输出节点下。在这个内部组中,我们发出像钢铁一样的节点,这些节点是该组的成员。