标准Muenchian grouping- XSLT(standard Muenchian grou

2019-06-26 03:35发布

我开发输入XML转换为使用XSLT如下提到的其它XML的XSL。

逻辑:在输入XML,我提到四个子元素“vehicle_No,vehicle_Model,说明,颜色”中的“车辆”。 我想要得到的结果,“如果‘vehicle_No,vehicle_Model车辆‘然后在值‘描述’应该成为元素,然后输出应该看起来像......,对于同样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和“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>

请让我知道,如果问题还不清楚。

Answer 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>

虽然这不是你预计上市的输出精确匹配,我认为,不同的是由于你的上市预期输出错误。 我特别指的是,其值是“紫色”的节点的位置。

说明

这个样式表使用2级Muenchian分组的的。 第一个层次是直截了当不够。 它基团的所有车辆一起,一个输出车辆元件在其下具有相同的车辆编号。 在的muenchian SO,最例子的for-each用于通过组成员进行迭代,而我已经使用的应用的模板。 它相当于同样的事情。

我有一个第二密钥(车辆通过表单),用于分组的第二级。 通过“形”,我的意思是,公交车,自行车等两个车辆数量和形式,这主要群体。 车辆的形式命名的输出节点进行分组。 和该内组中,我们发射像钢节点,它们是该组的成员。



文章来源: standard Muenchian grouping- XSLT