2016-08-07 24 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