查找彼此相邻的兄弟节点

问题描述 投票:0回答:1

我有一个巨大的 xml 和 xsl,在转换它时遇到一些错误。我想知道如果两个子节点在父节点内彼此相邻,则调用适当的模板。

让我们看看下面来自现有大 xml 的片段。 mydata:Headings 和 mydata:ActionText 之间可以有多个节点。另外,mydata:ActionText 内部可以有嵌套节点。

<mydata:Headings>
    <mydata:heading1>Heading one</mydata:heading1>
    <mydata:ActionText>
        <mydata:title>
           This is a test title<?start_mark?> show this value<?end-mark?> 
        </mydata:title>
    </mydata:ActionText>
    <?start_mark?> This appears in a different font and color inside another template<?end-mark?>
</mydata:Headings>

现在我需要在模板内部找出 mydata:ActionText 和处理指令 start_mark 是否彼此相邻。如果两者都存在,那么我需要调用模板this

<xsl:apply-templates select="mydata:ActionText|processing-instruction()"/>

如果只有mydata:ActionText存在,那么我需要像这样调用模板

<xsl:apply-templates select="mydata:ActionText"/>

如何检查?

我的模板如下所示:

<xsl:template match="mydata:Headings"> Here I have few xsl codes. I want to check the above condition here. </xsl:template>

xml xslt processing-instruction
1个回答
0
投票

如果您使用

<xsl:strip-space elements="*"/>
删除空白文本节点,这将是最简单的。在这种情况下你可以写

myData:ActionText[following-sibling::node()[1]
                    [self::processing-instruction(start_mark)]]

如果您必须考虑元素和处理指令之间的空白文本节点,那么它就变成了

myData:ActionText
  [following-sibling::node()
    [not(self::text()[normalize-space(.)=''])]]
    [1]
    [self::processing-instruction(start_mark)]
  ]

我想知道你是否真的需要这个?如果您正在尝试决定是否这样做

<xsl:apply-templates select="mydata:ActionText|processing-instruction()"/>

<xsl:apply-templates select="mydata:ActionText"/> 

那为什么不直接做前者呢?如果没有处理指令则效果与后一条指令相同。

最后,对您的问题进行评论。你首先说

我有一个巨大的 xml 和 xsl,在转换它时遇到一些错误。

想必您认为我们有必要知道这一点。但你没有说错误是什么 - 它是否与 XML 很大这一事实有关?您是否有性能问题,或者应用程序的可扩展性问题,或者是如何实现功能的问题?通过添加这些额外的事实,你让它变得混乱。

© www.soinside.com 2019 - 2024. All rights reserved.