假設我有下面的XML(這是TEI註釋方案的嵌入到HTML):爲什麼後裔或自我::不允許在模板模式?
<p>(See, for example, <bibl type="journal" xmlns="http://www.tei-c.org/ns/1.0"><author>Greger IH, et al.</author> <date>2007</date>, <title>Trends Neurosci.</title> <biblScope type="vol">30</biblScope> (<biblScope type="issue">8</biblScope>): <biblScope type="pp">407-16</biblScope></bibl>).</p>
現在我想的是複製所有標註節點到結果的XHTML,但只重命名<title>
到<bibTitle>
(如<title>
在<head>
只允許),所以就用下面的變換:
<xsl:template match="tei:bibl/descendant-or-self::*">
<xsl:variable name="nodeName">
<xsl:choose>
<xsl:when test="name() = 'title'">bibTitle</xsl:when>
<xsl:otherwise><xsl:value-of select="name()" /></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- Changing of the namespace occurs here, but we don't care -->
<xsl:element name="{$nodeName}">
<xsl:copy-of select="@*" />
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<xsl:template match="p/text()|tei:bibl//text()">
<xsl:copy-of select="." />
</xsl:template>
然而,它不編譯和以下錯誤遊:
Only child:: and attribute:: axes are allowed in match patterns! Offending axes = descendant-or-self
當我改變了比賽規則<xsl:template match="tei:bibl|tei:bibl//*">
它開始發揮預期。但是這應該與descendant-or-self::*
相同,對吧?我在這裏遇到了變壓器實施限制嗎?
首先我用Mozilla 3.5內部變壓器測試過,然後用Xalan 2.7.1測試 - 結果相同。
你能否說出你的想法,這個限制究竟是如何影響性能的(通過重寫規則到等同於變壓器必須執行相同的工作)?你能否提供一個例子,說明任何位置步驟後面的*謂詞*(對於我來說,這個斧頭的正確用法是什麼)?謝謝。 –
@dma_k:好的,看我更新的答案。 –
@dma_k:如果您提供了特定的轉換問題(一個XML文檔,所需的結果,規則),那麼我將很高興向您展示如何使用允許的語法指定模板。 –