В моем XSLT есть две таблицы поиска.

Таблица А:

<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 предоставлен клиентом, поэтому его формат высечен на камне для целей этого вопроса.

0
iwarv 13 Мар 2018 в 19:12

2 ответа

Лучший ответ

Используйте <xsl:variable name="devlookup" select="document('')[$protocol=1]/xsl:stylesheet/manufacturerA:lookup/device | document('')[$protocol=2]/xsl:stylesheet/manufacturerB:lookup/device"/>.

1
Martin Honnen 13 Мар 2018 в 16:19

Вместо жесткого кодирования таблицы поиска я использую свою в качестве параметра. Учтите следующее:

<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

Помните, что все ваши таблицы поиска должны иметь одинаковую схему.

0
David W. 16 Апр 2019 в 18:55