【问题标题】:How to group in XSLT using Muenchian Method?如何使用 Muenchian 方法在 XSLT 中进行分组?
【发布时间】:2014-08-07 11:33:46
【问题描述】:

我对 XSLT 很陌生,我正在使用 XSLT 1.0。现在我需要将一些东西分组到一个相当大的 XML 文件中。那里有很多例子,但出于某种原因,没有一个对我有用。我可以对我想要的信息进行分组,但我的输出 xml 中也有一些额外的文本。这就是我现在正在做的事情;

输入 XML(这是一个临时 XML,实际输入相当大,但我也可以将其应用于我的真实 xml)

<?xml version="1.0" encoding="utf-8"?>
<objects>
  <groupNumber>15</groupNumber>
  <object>
    <items>
      <item>
        <itemOptions>
          <itemNumber>1</itemNumber>
        </itemOptions>
      </item>
      <item>
        <itemOptions>
          <itemNumber>1</itemNumber>
        </itemOptions>
      </item>
      <item>
        <itemOptions>
          <itemNumber>2</itemNumber>
        </itemOptions>
      </item>
      <item>
        <itemOptions>
          <itemNumber>3</itemNumber>
        </itemOptions>
      </item>
      <item>
        <itemOptions>
          <itemNumber>3</itemNumber>
        </itemOptions>
      </item>
    </items>
  </object>
</objects>

现在我想按项目编号对项目进行分组。这就是我所做的;

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                exclude-result-prefixes="xs xsi xsl">

  <xsl:output method="xml" encoding="UTF-8" indent="yes"/>

  <xsl:key name="itemler" match="item" use="itemOptions/itemNumber" />

  <xsl:template match="items" name="temp">
    <numbers>
    <xsl:for-each select="item[count(. | key('itemler', itemOptions/itemNumber)[1])=1]">
      <number>
        <xsl:value-of select="itemOptions/itemNumber" />
      </number>
    </xsl:for-each>
    </numbers>
  </xsl:template>
</xsl:stylesheet>

使用这段代码,我得到了这个输出;

<?xml version="1.0" encoding="utf-8"?>
15

<numbers>
  <number>1</number>
  <number>2</number>
  <number>3</number>
</numbers>

这几乎正是我想要的,除了“15”。我从根目录下的标签中得到分组的数字和一个值。

当我尝试将此 XSLT 应用到我的主要 XML 时,我遇到了完全相同的错误,我从根目录下的标签和其他一些标签中获得了很多不需要的信息。这里有什么问题?

我猜这与模板或匹配有关,但我真的不知道如何解决。

非常感谢。

【问题讨论】:

  • 问题是您的模板应用于items,而您没有为其他节点定义任何其他内容。调试方法见this

标签: xml xslt xslt-1.0 muenchian-grouping


【解决方案1】:

添加模板在做

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

确保您只处理 items 元素。

【讨论】:

  • 非常感谢,成功了。如果您不介意,我还有一个问题,假设我有一个丢失模板的 xslt,这会带来什么麻烦吗?我只是这样测试过,没有任何问题,我只是要求确保不会有任何问题。
  • 正常处理从根节点/ 开始,然后您自己的模板和/或内置模板继续处理。如果您只想处理items 元素及其后代,那么我的建议很好,如果您想在某种程度上处理items 的祖先或兄弟姐妹,那么我的建议可能不适合。然而,还有其他方法,例如 &lt;xsl:template match="groupNumber"/&gt;,以确保不处理该元素的内容。
  • @user1767833 拥有许多模板通常要比嵌套许多层深的许多for-each块好得多。
猜你喜欢
  • 2015-07-30
  • 1970-01-01
  • 2015-04-10
  • 1970-01-01
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
  • 2013-05-11
  • 2018-03-28
相关资源
最近更新 更多