2009-01-14 57 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