【问题标题】:standard Muenchian grouping- XSLT标准 Muenchian 分组 - XSLT
【发布时间】:2012-07-08 07:11:05
【问题描述】:

我正在开发一个使用 XSLT 将输入 xml 转换为其他 xml 的 xsl,如下所述。

逻辑:在输入的xml中,我提到了“Vehicle”中的四个子元素“vehicle_No、vehicle_Model、Description、color”。我想得到一个结果“如果“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 中提到的“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>

如果问题不清楚,请告诉我。

【问题讨论】:

  • 在输入文档中,车辆 234 与车辆 123 的部件被分组在同一个车辆输出节点中。这是一个错误吗?

标签: xml xslt xml-serialization xml-parsing


【解决方案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 用于遍历组成员,而我使用了 apply-templates。意思是一样的。

我有第二个键(车辆形式),用于第二级分组。 “形式”是指汽车、公共汽车、自行车等。这对车辆编号和形式都是关键组。车辆在以表格命名的输出节点下分组。在这个内部组中,我们发出像钢一样的节点,它们是该组的成员。

【讨论】:

  • B.Durkin:输出几乎是我需要的,除了vehicle_no“234”。我需要“vehicle_no”,vehicle_model”,并且要放置在第一个“车辆”中的o / p不同,第二个“车辆”仅应出现“如果”描述与以前具有相同的值”在这种情况下......比较vehicle_no "123 & 345 " 它们的描述值相同。
  • 我不明白。也许您可以发布另一个问题,但有更多用例来解释问题。
  • Jeni Tennison 对此有一个久经考验的真实教程:jenitennison.com/xslt/grouping/muenchian.html
猜你喜欢
  • 1970-01-01
  • 2014-03-19
  • 2012-07-07
  • 2021-11-20
  • 2018-03-28
  • 2021-11-04
  • 1970-01-01
  • 2016-05-19
  • 2019-05-20
相关资源
最近更新 更多