0

我正在使用 xsl 进行 XML 转换,为此我必须使用多个查找。查找 xml 具有以下格式。

<lookups>
    <lookup attr1="val1a" attr2="val1b">
    <lookup attr1="val2a" attr2="val2b">
<lookups>

所有查找 xml 都使用上述格式。例如元素 A 的查找文件在那里,元素 B 的另一个查找文件也在那里,具有相同的元素结构但与元素 B 相关的不同值。然后我在主 xsl 文件中进行如下查找。

<!-- here come the first lookup for element A -->
<xsl:key name="A-lookup" match="lookup" use="@attr1"/>
<xsl:variable name="ALookupDoc" select="document('ALookup.xml')"/>

<xsl:template match="A">
    <Anew>
        <xsl:apply-templates select="$ALookupDoc/*">
        <xsl:with-param name="curr-code" select="string(.)"/>
    </xsl:apply-templates>
    </Anew>
</xsl:template>

<xsl:template match="lookups">
    <xsl:param name="curr-code"/>
    <xsl:value-of select="key('A-lookup', $curr-code)/@attr2"/>
</xsl:template>

<!-- And the second one for element B -->
<xsl:key name="B-lookup" match="lookup" use="@attr1"/>
<xsl:variable name="BLookupDoc" select="document('BLookup.xml')"/>

<xsl:template match="B">
    <Anew>
        <xsl:apply-templates select="$BLookupDoc/*">
        <xsl:with-param name="curr-code" select="string(.)"/>
    </xsl:apply-templates>
    </Anew>
</xsl:template>

<xsl:template match="lookups">
    <xsl:param name="curr-code"/>
    <xsl:value-of select="key('B-lookup', $curr-code)/@attr2"/>
</xsl:template>

现在没事了。问题是元素 A 的第一次查找工作正常。但不是第二个。正如我所看到的,有两个有问题的部分。

  1. 两个查找具有相同的元素名称(查找和查找)。一旦我将第二个查找 XML 更改为不同的元素(lookupsX 和 lookupX)和相应的模板,它们就可以正常工作。
  2. 同一元素有两个模板(查找元素 A 和 B)

我仍然不确定问题出在哪里。

4

1 回答 1

1

我认为问题在于您有两个具有完全相同match值的模板,因此实际上只使用了其中一个。你可以通过给他们不同的模式来解决这个问题,但是这样的事情怎么样:

  <!-- here come the first lookup for element A -->
  <xsl:key name="A-lookup" match="lookup" use="@attr1"/>
  <xsl:variable name="ALookupDoc" select="document('ALookup.xml')"/>

  <xsl:template match="A">
    <Anew>
      <xsl:apply-templates select="$ALookupDoc/*">
        <xsl:with-param name="curr-code" select="string(.)"/>
        <xsl:with-param name="keyName" select="'A-lookup'" />
      </xsl:apply-templates>
    </Anew>
  </xsl:template>

  <!-- And the second one for element B -->
  <xsl:key name="B-lookup" match="lookup" use="@attr1"/>
  <xsl:variable name="BLookupDoc" select="document('BLookup.xml')"/>

  <xsl:template match="B">
    <Anew>
      <xsl:apply-templates select="$BLookupDoc/*">
        <xsl:with-param name="curr-code" select="string(.)"/>
        <xsl:with-param name="keyName" select="'B-lookup'" />
      </xsl:apply-templates>
    </Anew>
  </xsl:template>

  <xsl:template match="lookups">
    <xsl:param name="curr-code"/>
    <xsl:param name="keyName" />

    <xsl:value-of select="key($keyName, $curr-code)/@attr2"/>
  </xsl:template>

再说一次,您可能不需要两个键,因为它们都具有相同的定义。请看看这是否有效:

  <!-- here come the first lookup for element A -->
  <xsl:key name="lookup" match="lookup" use="@attr1"/>
  <xsl:variable name="ALookupDoc" select="document('ALookup.xml')"/>

  <xsl:template match="A">
    <Anew>
      <xsl:apply-templates select="$ALookupDoc/*">
        <xsl:with-param name="curr-code" select="string(.)"/>
      </xsl:apply-templates>
    </Anew>
  </xsl:template>

  <!-- And the second one for element B -->
  <xsl:variable name="BLookupDoc" select="document('BLookup.xml')"/>

  <xsl:template match="B">
    <Anew>
      <xsl:apply-templates select="$BLookupDoc/*">
        <xsl:with-param name="curr-code" select="string(.)"/>
      </xsl:apply-templates>
    </Anew>
  </xsl:template>

  <xsl:template match="lookups">
    <xsl:param name="curr-code"/>

    <xsl:value-of select="key('lookup', $curr-code)/@attr2"/>
  </xsl:template>
于 2013-02-06T05:24:08.450 回答