XSLT条件查找表

时间:2018-03-13 16:12:20

标签: xml xslt

我的XSLT中有两个查找表。

表A:

<manufacturerA:lookup>
  <device code="129" mapped="foo device"/>
</manufacturerA:lookup>

表B:

<manufacturerB:lookup>
  <device code="129" mapped="bar device"/>
</manufacturerB:lookup>

是否可以根据传入的参数protocol有条件地将查找表分配给变量? 我试过这个无济于事:

<xsl:template match="device">
  <xsl:param name="protocol"/>
  <xsl:variable name="devtype" select="type"/>
  <xsl:variable name="devlookup">
    <xsl:choose>
      <xsl:when test="$protocol=1">
        <xsl:text>document('')/xsl:stylesheet/manufacturerA:lookup/device</xsl:text>
      </xsl:when>
      <xsl:when test="$protocol=2">
        <xsl:text>document('')/xsl:stylesheet/manufacturerB:lookup/device</xsl:text>
      </xsl:when>
    </xsl:choose>
  </xsl:variable>

  ...

  <!-- use the lookup to find textual description -->
  <xsl:attribute name="type">
    <xsl:value-of select="$devlookup[@code=$devtype]/@mapped"/>
  </xsl:attribute>

</xsl:template>

期望的结果

如果我转换源XML ...

<blob>
  <protocol>1</protocol>
  <device>
    <type>129</type>
  </device>
</blob>
<blob>
  <protocol>2</protocol>
  <device>
    <type>129</type>
  </device>
</blob>

它应分别转换为“foo device”和“bar device”。

注意:

源XML来自客户,因此,为了解决这个问题,它的格式是完整的。

2 个答案:

答案 0 :(得分:1)

使用<xsl:variable name="devlookup" select="document('')[$protocol=1]/xsl:stylesheet/manufacturerA:lookup/device | document('')[$protocol=2]/xsl:stylesheet/manufacturerB:lookup/device"/>

答案 1 :(得分:0)

我将我的作为参数,而不是对查找表进行硬编码。请考虑以下内容:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
<xsl:output method="xml" omit-xml-declaration="no" encoding="utf-8" indent="no" />
<xsl:param name="tablename">xxxx</xsl:param>
<xsl:variable name="lookupDoc" select="document($tablename)" />

<xsl:template match="/">
    <test>
        <value><xsl:value-of select="$lookupDoc/root/tag1/etc/etc/etc"/></value>
    </test>
</xsl:template>

</xsl:stylesheet>

当调用它时,我只需按如下方式传递查找表:

xsltproc --stringparam tablename file2.xml tableparam.xsl 1639089.xml

请记住,您的查找表都应具有相同的架构。