我需要一些 XSLT 语句,它给了我类似“LEFT JOIN”的东西:如果选定的节点确实存在,则返回所有这样的节点,否则只循环一次。
这与 xsl:for-each 循环不同,因为当没有这样的节点时,for-each 循环返回零行。
这是一个实际的例子。
XML 文件:
<root>
<sec1>
<x1/> ... <x1/>
</sec1>
<sec2>
<x2/> ... <x2/>
</sec2>
...
<sec10>
<x10/> ... <x10/>
</sec10>
</root>
现在,我不知道我有多少个“x1”、“x2”、..“x10”,我想打印出所有可能的组合。一个简单而错误的解决方案:
<xsl:for-each select="/root/sec1/x1">
<xsl:for-each select="/root/sec2/x2">
...
<xsl:for-each select="/root/sec10/x10">
...print x1 and x2... and x10
</xsl:for-each>
...
</xsl:for-each>
</xsl:for-each>
这个解决方案是错误的,因为如果没有“x3”,它会返回 0 行(就像 FULL JOIN 一样),而我想查看所有其他值(如 LEFT 或 RIGHT JOIN)。
我可以使用 xsl:choose、xls:when、xsl:foreach 和 xsl:otherwise 的组合,但这很长。
我尝试构建自己的 xsl 模板,但它不起作用:
<xsl:template name="left-join">
<xsl:param name="select"/>
<xsl:param name="template"/>
<xsl:choose>
<xsl:when test="$select">
<xsl:for-each select="$select">
<xsl:call-template name="$templatename"> <!--WRONG -->
<xsl:with-param name="one-parameter" select="$select"/>
</xsl:call-template>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="$templatename">
<xsl:with-param name="one-parameter" select="$select"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>