无法在模板匹配中使用变量。 xslt版本1

时间:2014-04-23 14:43:00

标签: xml xslt xpath

大家。

我正在尝试创建一个xslt样式表来对xml文件运行转换。麻烦的是,由于我必须使用版本1,我无法使用变量或参数作为模板匹配的一部分'调用

本质上......这是我正在使用的xml的示例...

<tbody>
    <tr layoutcode="" type="categoryhead" level="2">
        <td colname="1">&lt;1&gt;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">&lt;2&gt;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

3 个答案:

答案 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>

选择和参数只是示例。你明白了吗?