2016-12-14 48 views
0

我需要指定從html文件到文本文件的輸出順序。因此我使用xsl:apply-templates select方法。 它工作正常,但爲了微調不同節點的輸出,我需要一個相應的模板,而不僅僅是一個普通模板。這也可以,但我需要在模板匹配模式中重複選擇模式。xslt:在選擇和匹配中使用變量

我喜歡定義一個保存模式的變量,因此只需要定義一次。 下面是我簡化的樣式表和簡化的html,它不起作用,但給出了我想要完成的想法。 是否可以使用這樣的變量?如果需要,我可以同時使用xslt 1.0和2.0。

<xsl:stylesheet ...> 
    ... 

    <xsl:variable name="first">div[@class='one']</xsl:variable> 
    <xsl:variable name="second">div[@class='two']</xsl:variable> 

    <xsl:template match="/*"> 
    <xsl:apply-templates select="//$first"/>           
    <xsl:apply-templates select="//$second"/>          
    ... 
    </xsl:template> 

    <xsl:template match="//$first"> 
    <xsl:text>Custom text for class one:</xsl:text><xsl:value-of select="text()"/> 
    </xsl:template> 

    <xsl:template match="//$second"> 
    <xsl:text>Custom text for class two:</xsl:text><xsl:value-of select="text()"/> 
    </xsl:template> 

</xsl:stylesheet> 

的HTML:

... 
<div class="two">text from two</div> 
<div class="one">text from one </div> 
... 

所需的輸出:

Custom text for class one: text from one 
Custom text for class two: text from two 

回答

0

XSLT中的變量保留值,而不是表達式的片段。 (換句話說,XSLT不是一種宏語言)。

作爲需要XSLT 3.0的Martin解決方案的替代方案,您可以考慮使用有時稱爲「元樣式表」的方法 - 將轉換作爲樣式表本身的預處理步驟。您甚至可以編寫通用樣式表來使用XSLT 3.0語法以及_match之類的影子屬性,並執行XSLT預處理階段以將其轉換爲常規XSLT 1.0或2.0語法以供執行。

0

沒有辦法使用XSLT 1或2這樣的變量的唯一方法是寫一個樣式表生成第二個樣式表並單獨執行。

在XSLT 3有所謂static variables/parametersshadow attributes新功能,可以幫助或有您可以使用transform功能直接與XSLT,而不是與宿主語言單獨的步驟執行新生成的樣式表。

但使用XSLT 2可以縮短

<xsl:apply-templates select="//div[@class='one']"/>           
<xsl:apply-templates select="//div[@class='two']"/> 

<xsl:apply-templates select="//div[@class='one'], //div[@class='two']"/> 

爲了完整這裏是在陰影中使用兩個靜態參數的XSLT 3的方法屬性:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:math="http://www.w3.org/2005/xpath-functions/math" 
    exclude-result-prefixes="xs math" 
    version="3.0"> 

    <xsl:param name="first" static="yes" as="xs:string" select="&quot;div[@class='one']&quot;"/> 

    <xsl:param name="second" static="yes" as="xs:string" select="&quot;div[@class='two']&quot;"/> 

    <xsl:template match="/*"> 
     <xsl:apply-templates _select="//{$first}, //{$second}"/>           
    </xsl:template> 

    <xsl:template _match="{$first}"> 
     <xsl:text>Custom text for class one:</xsl:text><xsl:value-of select="text()"/> 
    </xsl:template> 

    <xsl:template _match="{$second}"> 
     <xsl:text>Custom text for class two:</xsl:text><xsl:value-of select="text()"/> 
    </xsl:template> 

</xsl:stylesheet>