我有一个巨大的 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>
如果您使用
<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 很大这一事实有关?您是否有性能问题,或者应用程序的可扩展性问题,或者是如何实现功能的问题?通过添加这些额外的事实,你让它变得混乱。