大家。
我正在尝试创建一个xslt样式表来对xml文件运行转换。麻烦的是,由于我必须使用版本1,我无法使用变量或参数作为模板匹配的一部分'调用
本质上......这是我正在使用的xml的示例...
<tbody>
<tr layoutcode="" type="categoryhead" level="2">
<td colname="1"><1>Common stocks[Stop Here] 87.49%</td>
<td colname="2"/>
<td colname="3"/>
<td colname="4"/>
</tr>
<tr layoutcode="" type="categoryhead" level="3">
<td colname="1"><2>Health care 23.42%</td>
<td colname="2"/>
<td colname="3"/>
<td colname="4"/>
</tr>
<tr layoutcode="" type="detail" level="5">
<td colname="1">Gillan Sciences, Inc.[Category Caption]1</td>
<td colname="2">19,127,226</td>
<td colname="3">1,583,543</td>
<td colname="4">4.04</td>
</tr>
</tbody>
我想停在包含文字&#39; [类别标题&#39;然后做点什么我可以这样做....
<xsl:template match="tr[@type = 'detail']/td[contains(./text(), '[Category Caption]')]">
(do something)
....但我希望文本是一个变量,xslt不会让我这样做..
<xsl:template match="tr[@type = 'detail']/td[contains(./text(), $VariableName)]">
(do something)
有没有人知道如何进行更通用的模板匹配,然后可能有一个选择选项来确定元素文本是否包含我变量中的内容?
非常感谢 Fordprefect141
答案 0 :(得分:1)
好的
<xsl:param name="VariableName" select="'[Category Caption]'"/>
<xsl:template match="tr[@type = 'detail']/td">
<xsl:choose>
<xsl:when test="contains(., $VariableName)">...</xsl:when>
<xsl:otherwise>...</xsl:when>
</xsl:choose>
</xsl:template>
您可以使用模板内部的变量或参数。如果您不需要xsl:if
,则xsl:otherwise
可能就足够了。
答案 1 :(得分:0)
试试这个:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output indent="yes" method="xml"/>
<xsl:param name="text2search" select="'[Category Caption]'"/>
<xsl:template match="/">
<xsl:call-template name="useVariable">
<xsl:with-param name="text2search" select="$text2search"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="useVariable">
<xsl:param name="text2search"/>
<result>
<xsl:if test="//tr[@type = 'detail']/td[contains(text(), $text2search)]">
<xsl:copy-of select="(//tr[@type = 'detail']/td)[1]"/>
</xsl:if>
</result>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:0)
模板上的匹配条件是静态的,因为您无法在匹配过程中移交变量。您可以做的是交出参数并使用<xsl:if>
条件仅在满足时才执行。这些方面的东西:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="outside" /> <!-- your XSLT processor would supply that one -->
<xsl:template match="something">
<xsl:call-template name="flexitemp">
<xsl:with-param name="inside" select="@name" />
</xsl:call-template>
</xsl:template>
<xsl:template name="flexitemp" match="/">
<xsl:param name="inside" />
<xsl:if test="$inside=$outside">
<!-- Do your thing here -->
</xsl:if>
</xsl:template>
</xsl:stylesheet>
选择和参数只是示例。你明白了吗?