2016-08-07 38 views
1

我對XSLT非常陌生,我很努力去理解一些代碼。以下是代碼,我不明白:XSLT「匹配」和「如果」的含義

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

和:

<xsl:if test="*"> 

是什麼意思,當你測試*符號?

+0

這是一個通配符 - 匹配任何內容。 – OldProgrammer

+2

第一個代碼是Identity變換模板,用於複製輸入中原樣存在的每個節點和屬性;在stackoverflow上有相同的問題,你可以通過一些來了解它是如何工作的。第二個是在當前節點上測試以檢查它是否有任何子元素(僅用於元素而不是「任何」);如果是,則輸入'xsl:if',否則不輸入。 –

+0

你如何接近自己的語言教學任務?只要你找到一個你以前沒有見過的構造,就去問這個問題並不是最有效的方法。我可能會過時,但是當我解決一門新的語言時,我所做的第一件事就是獲得一本索引良好的書,並在編寫任何代碼之前花費幾個晚上的時間閱讀它。 –

回答

2

第一個模板是identity transform的基礎,通常用作「推式」樣式表的基礎,默認行爲是將輸入簡單地複製到輸出中。爲了定製行爲並生成不同的內容,添加了更多特定的模板。

<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

該模板將匹配任何屬性@*和任何節點(元素,註釋,文字,或處理指令)node(),並且是用於簡寫:*|comment()|text()|processing-instruction()

當任何這些項目中的匹配,該模板首先複製匹配的項目,然後調用xsl:apply-templates獲取上下文項目的任何屬性或node()子項。如果屬性爲text()comment()processing-instruction(),則不會有屬性或子項node()。對於一個元素,它可以匹配這些東西。除非有更具體的模板,否則它只會與此模板匹配並複製匹配的項目並繼續處理其屬性和子項(如果有的話)。

xsl:if的情況下:

<xsl:if test="*"> 

即進行測試以查看是否有任何的子元素(從上下文節點相對)。如果有,則條件滿足,測試評估結果爲true(),並且如果將要應用的內容是什麼。

有關縮寫語法的更多信息,請參閱規格: https://www.w3.org/TR/xpath/#path-abbrev