我正在使用XSLT 2.0。在xsl:template
(模板-1)中,我使用xsl:analyze-string
創建具有xml:lang
屬性的新的span
元素。我有第二個模板(template-2),它將class
屬性添加到包含xml:lang
屬性的元素。在我的樣式表中,由第一個模板創建的新創建的span元素沒有被第二個處理。我如何解決這個問題,並讓第二個模板對第一個模板的結果進行操作?XSLT模板不適用於新創建的元素
實施例:
輸入:<p>The base form of a noun is technically called a <span xml:lang="sa-Latn">prātipadika</span> (प्रातिपदिक).</p>
所需的輸出:<p>The base form of a noun is technically called a <span xml:lang="sa-Latn" class="lang-sa-latn">prātipadika</span> (<span xml:lang="sa-Deva" class="lang-sa-deva">प्रातिपदिक</span>).</p>
該正確的輸出具有最終span
既xml:lang
和class
屬性。
樣式表輸出:<p>The base form of a noun is technically called a <span xml:lang="sa-Latn" class="lang-sa-latn">prātipadika</span> (<span xml:lang="sa-Deva">प्रातिपदिक</span>).</p>
在最終的span
上錯誤輸出class="sa-lang-deva"
。
(由樣式表幫助所產生的額外的類來解決不足的CSS支持一定的電子書閱讀器的。)
這裏是我的樣式表:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml"
xpath-default-namespace="http://www.w3.org/1999/xhtml"
xmlns:xml="http://www.w3.org/XML/1998/namespace"
xmlns:epub="http://www.idpf.org/2007/ops">
<xsl:output method="xhtml" encoding="utf-8" indent="no"/>
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops">
<xsl:apply-templates/>
</html>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- Template-1: Add xml:lang attribute to Devanagari text. -->
<xsl:template match="element()/text()">
<xsl:variable name="textValue" select="."/>
<xsl:analyze-string select="$textValue" regex="([ऀ-ॿ]+)((\s+[ऀ-ॿ]+)*)">
<xsl:matching-substring>
<span xml:lang="sa-Deva"><xsl:value-of select="."/></span>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
<!-- Template-2: Add lang-* class attribute when xml:lang attribute present. -->
<xsl:template match="*[@xml:lang]">
<xsl:call-template name="addClass">
<xsl:with-param name="newClass">lang-<xsl:value-of select="@xml:lang"/></xsl:with-param>
</xsl:call-template>
</xsl:template>
<!-- Add a class attribute to an element. -->
<xsl:template name="addClass">
<xsl:param name="newClass"/>
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:attribute name="class"><xsl:value-of select="normalize-space(concat(@class, ' ', lower-case($newClass)))"/></xsl:attribute>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
這很好用!謝謝。我沒有想到這樣捕獲節點。您設置模式的方式也很有指導意義。 – keithm 2015-02-08 23:44:55