XSL / XPath缩进

时间:2009-01-14 17:29:12

标签: xslt xpath

您使用哪些约定(如果有)来缩进XSL代码?

  • 你如何处理真正漫长而复杂的XPath
  • 你可以将它们插入你选择的XML编辑器吗?
  • 是否有一些开源代码可以很好地完成工作?

对于某些背景,我在Emacs中使用nxml-mode。在大多数情况下,它可以配置子元素应缩进的空格数。虽然涉及到复杂的XPath,但它并不是很好。如果我的代码中有一个很长的XPath,我希望通过使它看起来像这样的结构尽可能透明......

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

但是,我目前必须手动执行此操作,因为nxml只会将其与“/ some ..”对齐。

4 个答案:

答案 0 :(得分:1)

在我看来,很长的xpath难以阅读,应该避免。有两种方法可以做到:

  1. 简化源xml。
  2. 将大模板拆分为较小的模板。

答案 1 :(得分: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>

答案 2 :(得分:1)

不要使用长xpath。抛弃for-each并使用匹配模板。将xpath分解为几个模板。阅读一堆琐碎的匹配模板要比其中一个更容易。

答案 3 :(得分:1)

有时候,即使您使用模板而不是for-eaches,也无法避免使用更长的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"/>

我倾向于不打破跨越行的“简单”路径,但会破坏运营商或条件下的“更大”路径。

为了编辑,我使用Oxygen(它是跨平台的)并且它很好地处理这种间距。有时候它并不能准确地预测你想要什么,但是即使你重新缩进你的代码,它也会在那里保持空间。