2009-01-14 40 views
6

您使用什麼約定(如果有)縮進XSL代碼?XSL/XPath縮進

  • 你怎麼處理很長的,複雜的XPath
  • ,你可以將它們插入您選擇的XML編輯器?
  • 是否有一些開源代碼能很好地完成這項工作?

對於一些背景,我在Emacs中使用nxml模式。絕大多數情況下,您可以配置子元素應該縮進的空格數量。雖然它涉及到複雜的XPath,但它並不是很好。如果我在我的代碼很長的XPath,我喜歡做它的結構可以通過使它看起來像這樣一樣透明......

<xsl:for-each select="/some 
         /very[@test = 'whatever'] 
         /long[@another-test = perhaps 
               /another 
               /long 
               /xpath[@goes='here']] 
         /xpath" 

不過,我現在必須做手工,作爲nxml只會將其與「/ some ..」對齊。

回答

1

有時候,即使您使用模板而不是使用模板(如果可以的話),也無法避免使用更長的xpath。這是在XSLT/XPath 2.0中尤其如此:

<xsl:attribute name="tablevel" 
    select="if (following::*[self::topic | self::part]) 
      then (following::*[self::topic | self::part])[1]/@tablevel 
      else @tablevel"/> 

我傾向於不要打破跨行一個「簡單」的路徑,但將打破「大」路在運營商或條件句。

爲了進行編輯,我使用了氧氣(它是跨平臺的),它處理這種間距相當不錯。有時候它並不能預測你想要的東西,但它會保留空間,即使你重新縮進你的代碼。

1

在我看來,很長的xpaths很難閱讀,應該避免。有兩種方法可以做到這一點:

  1. 簡化源xml。
  2. 將大模板拆分爲小模板。
1

如果我在閱讀xpath語句時遇到困難(這種情況不常發生,但偶爾會發生),我傾向於分解XSL ......它實際上與我的分解方法非常相似其他語言的語法...因此,您在問題中的示例可能會變成如下更多內容:

<xsl:for-each select="/some/very[@test = 'whatever']/long"> 
    <xsl:if test="@another-test = perhaps/another/long/xpath[@goes='here']"> 
    <xsl:for-each select="xpath"> 
     ... result xml .... 
    </xsl:for-each> 
    </xsl:if> 
</xsl:for-each> 
1

請勿使用長xpath。溝通for-each並使用匹配模板。將xpath分解成幾個模板。閱讀一堆平凡的比賽模板比其中的一個更容易。

+0

這會影響性能,如果影響它,多少? – chiborg 2010-01-28 08:47:21

+0

@chiborg,大多數處理器都會編譯XSL,所以差異「應該」是最小的。該語言是作爲模板匹配引擎構建的,因此這應該是最佳方法。無論如何,這是您學會在XSL中「思考」的唯一方法。 – Ishmael 2010-01-28 21:00:46