【问题标题】:XSLT 2.0 / XPATH testing for parent element in specific positionXSLT 2.0 / XPATH 测试特定位置的父元素
【发布时间】:2018-10-28 10:24:08
【问题描述】:

在 XSLT 2.0 和 XPATH 中,在 <xsl:template match="lb"> 内,我正在测试各种不同的 case,每种情况都会产生不同的 HTML 输出(使用 xsl:choose/xsl:when)。

我想测试以下情况,其中lbseg 元素内任何类型的第一个节点:

<seg><lb break="n"/>text</seg>

相比之下,这些测试会失败:

<seg>text<lb break="n"/>text</seg>

<seg><foo/><lb break="n"/>text</seg>

我尝试将 parentposition() 组合在一起,但测试不正确。

非常感谢。

【问题讨论】:

    标签: xslt xpath xslt-2.0


    【解决方案1】:

    在我看来,拥有一个匹配 lb 的模板,然后使用 xsl:choose/when 可以更优雅、更紧凑地解决,并使用精确的匹配模式,例如xsl:template match="seg/node()[1][self::lb]" 将匹配 seg 父节点的任何第一个子节点,其中子节点是 lb 元素。对于其他条件,您可以设置具有不同匹配模式的不同模板。

    但如果需要,您可以在xsl:template match="lb" 中使用. is parent::seg/node()[1] 以相反的方式编写它。

    【讨论】:

    • 我从 XSLT 的角度理解模板的优雅。但是,如果lb(= TEI 中的换行符:XML)是一个不需要其他模板处理的节点,我有 5 种(!)不同的方式来处理它并根据位置及其属性输出 HTML,在我看来代码在xsl:choose 中更具可读性/可调试性和紧凑性?我试图感受处理中的微妙之处。谢谢。
    • 我非常希望拥有五个具有五种不同匹配模式的单独模板来处理处理这些情况的五种不同方式,但这部分是个人喜好,显然还取决于您的输入/输出映射需要,特别是如何在更高级别上设置处理(例如,只有一个通用的 apply-templates 没有任何 select 或几个具有不同选择属性的)。
    【解决方案2】:
    /seg/child::node()[1]/name() = 'lb'
    

    检查第一个孩子是否命名为“lb”

    【讨论】:

    • 这里不从lb的角度测试,即&lt;xsl:template match="lb"&gt;。因此,我认为XPATH应该以./....parent:...开头,然后测试self的位置?
    • 不,因为对于我正在编写的上下文,模板的当前节点必须是lb。有关上下文的解释,请参阅我对帖子的补充。
    • 如果您已经选择了 lb 元素,我不确定 xpath 是否允许向后匹配
    • 是的,parentancestor 允许您“向后”或向根节点前进。
    • 这个呢? lb/parent::seg/child::node()[1]/name() = 'lb' - 检查父节点是否为“seq”
    【解决方案3】:

    您可以简单地测试是否没有前面的兄弟姐妹:

    <xsl:when test="not(preceding-sibling::node())">
    

    请注意node() 也包括 cmets 和处理指令,而不仅仅是元素和文本。

    或者,如果您有一个匹配 seg 的模板,您可以在其中执行类似的操作...

    <xsl:template match="seg">
      <xsl:copy>
         <xsl:apply-templates />
      </xsl:copy>
    </xsl:template>
    

    然后,因为&lt;xsl:apply-templates /&gt;&lt;xsl:apply-templates select="node()" /&gt; 的缩写,您可以在模板中使用position()

    <xsl:when test="position() = 1">
    

    如果“seg”模板执行&lt;xsl:apply-templates select="lb" /&gt;,这将不起作用。

    有关实际测试的示例,请参阅 http://xsltfiddle.liberty-development.net/nc4NzRd

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-21
      • 2020-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2021-09-02
      • 1970-01-01
      相关资源
      最近更新 更多