我有一個系列中型XML文檔,其中主要是文本與代表宏的幾個節點中展開,如:優化<xsl:choose>許多<xsl:when>
<foo>Some text <macro>A1</macro> ... <macro>B2</macro> ...etc...</foo>
我的目標是,以取代每個宏相應的XML。通常這是一個具有不同屬性的單個<img>
標籤,但它也可以是其他一些HTML。
樣式表被編程產生,而要做到這將是有每個宏模板,例如單程
<xsl:template match="macro[.='A1']">
<!-- content goes here -->
</xsl:template>
<xsl:template match="macro[.='A2']">
<!-- other content goes here -->
</xsl:template>
<xsl:template match="macro[.='B2']">
<!-- etc... -->
</xsl:template>
它工作得很好,但它最多可以有一百個宏,它不是很高性能的(我用的libxslt)。我試過一對夫婦的替代,如:
<xsl:template match="macro">
<xsl:choose>
<xsl:when test=".='A1'">
<!-- content goes here -->
</xsl:when>
<xsl:when test=".='A2'">
<!-- other content goes here -->
</xsl:when>
<xsl:when test=".='B2'">
<!-- etc... -->
</xsl:when>
</xsl:choose>
</xsl:template>
它的性能稍高一些。我曾嘗試加入分支的另一個層面,如:
<xsl:template match="macro">
<xsl:choose>
<xsl:when test="substring(.,1,1) = 'A'">
<xsl:choose>
<xsl:when test=".='A1'">
<!-- content goes here -->
</xsl:when>
<xsl:when test=".='A2'">
<!-- other content goes here -->
</xsl:when>
</xsl:choose>
</xsl:when>
<xsl:when test=".='B2'">
<!-- etc... -->
</xsl:when>
</xsl:choose>
</xsl:template>
它加載速度稍慢(在XSL是更大,更復雜一點),但它稍快(每個分支可以消除幾種情況。)執行
現在我想知道,有沒有更好的方法來做到這一點?我有大約50-100宏。通常,轉換是使用libxslt執行的,但我不能使用其他XSLT引擎的專有擴展。
任何投入都是歡迎的。
奇怪的是,我已經嘗試過類似的東西,但它不起作用,因爲'document('')'返回了源文檔的根,而不是樣式表的根。我剛剛檢查過XSLT規範,實際上,它應該返回樣式表的根目錄,所以無論是我發現了一個錯誤還是我在某處都搞砸了。我會再試一次,並保持更新,謝謝。 – 2010-07-13 00:45:12
確實,這是一個我知道的libxslt錯誤(https://bugzilla.gnome.org/show_bug.cgi?id=549552)雖然我得到了它的工作,並且性能似乎與第二種方法相當上市。如果重複使用相同的宏,看起來它會更好地縮放。 – 2010-07-13 01:14:16