为什么我的XSLT键查找不起作用?

时间:2017-04-18 16:40:14

标签: xml xslt xslt-1.0

我有以下XML:

<errorsSortedIntoRows>
  <row y="044">
    <error x="002" y="044" errorClass="early" deviation="-2"/>
    <error x="002" y="044" errorClass="early" deviation="-5"/>
    <error x="002" y="044" errorClass="early" deviation="-3"/>
  </row>
  <row y="045">
    <error x="023" y="045" errorClass="late" deviation="20"/>
    <error x="023" y="045" errorClass="late" deviation="10"/>
    <error x="013" y="045" errorClass="wrong" deviation="33"/>
    <error x="013" y="045" errorClass="wrong" deviation="40"/>
  </row>
</errorsSortedIntoRows>

我想要消除关于x和y的所有重复:

<xsl:stylesheet version=1.0 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="xyLookup" match="error" use="concat(@x, '|', @y)"/>

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()">
      <xsl:sort select="@y"/>
      <xsl:sort select="@x"/>
      <xsl:sort select="@deviation"/>
    </xsl:apply-templates>
  </xsl:copy>
</xsl:template>

<xsl:template match="error[@errorClass = 'early']">
  <xsl:value-of select="key('xyLookup', concat(@x, '|', @y))[1]"/>
</xsl:template>

<xsl:template match="error[@errorClass = 'late']">
  <xsl:value-of select="key('xyLookup', concat(@x, '|', @y))[last()]"/>
</xsl:template>

<!-- For cases that are wrong, we just toss the duplicates. -->
<xsl:template match="error[not(generate-id() = 
                               generate-id(key('xyLookup', concat(@x, '|', @y))[1]))]"/>
</xsl:stylesheet>

无论出于何种原因,我得到的唯一输出是行标记,所有错误标记都不再存在:

<errorsSortedIntoRows>
<row y="001"/>
<row y="002"/>
<row y="003"/>
.
.
.
<row y="055"/>
</errorsSortedIntoRows>

这甚至用来工作,但我改变了一些标签和属性的名称,一切都停止了工作。我做错了什么?

1 个答案:

答案 0 :(得分:2)

尝试将xsl:value-of改为xsl:copy-of ...

<xsl:template match="error[@errorClass = 'early']">
  <xsl:copy-of select="key('xyLookup', concat(@x, '|', @y))[1]"/>
</xsl:template>

<xsl:template match="error[@errorClass = 'late']">
  <xsl:copy-of select="key('xyLookup', concat(@x, '|', @y))[last()]"/>
</xsl:template>