我的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来自客户,因此,为了解决这个问题,它的格式是完整的。
答案 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
请记住,您的查找表都应具有相同的架构。