gpt4 book ai didi

xml - XSLT:使子节点成为上下文节点的兄弟节点

转载 作者:行者123 更新时间:2023-12-04 06:33:02 24 4
gpt4 key购买 nike

对此进行了搜索并没有找到答案,所以这里是......

我有一些类似于以下的 xml:

<?xml version="1.0" encoding="utf-8"?>
<footnote ref="1">
<para>Here is some text about some guy who made
<emphasis role="italic">fascinating</emphasis> comment I want to quote
<blockquote> So I went to this place and met this guy....</blockquote>
It seemed more interesting at the time.
</para>
</footnote>

我想使用 xslt 将其更改为新模式(使用新的命名空间前缀)
<?xml version="1.0" encoding="utf-8"?>
<nns:footnote ref="1">
<nns:fn-para>Here is some text about some guy who made
<nns:emph type="it">fascinating</nns:emph> comment I want to quote:
</nns:fn-para>
<nns:fn-blockquote>
<nns:bq-para>So I went to this place and met this guy....</nns:bq-para>
</nns:fn-blockquote>
<nns:fn-para> It seemed more interesting at the time.</nns:fn-para>
</nns:footnote>

我已经尝试了一些东西......取一个作为脚注后代的段落并循环遍历 child ,但这有问题,因为它不仅是段落中的文本节点,还有 emph 标签,我仍然没有'不知道如何将子节点放置在树上和结果树中……这有意义吗?

最佳答案

编辑 :小重构和扩展解释。

这个样式表:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:nns="nns">
<xsl:key name="kNodeByPrecedingBlock"
match="para/node()[not(self::blockquote)]"
use="generate-id(
(..|preceding-sibling::*[self::blockquote][1])[last()]
)"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="footnote">
<nns:footnote>
<xsl:apply-templates select="node()|@*"/>
</nns:footnote>
</xsl:template>
<xsl:template match="para">
<xsl:apply-templates select=".|blockquote" mode="group"/>
</xsl:template>
<xsl:template match="emphasis">
<nns:emph>
<xsl:apply-templates select="node()|@*"/>
</nns:emph>
</xsl:template>
<xsl:template match="emphasis/@role">
<xsl:attribute name="type">
<xsl:value-of select="substring(.,1,2)"/>
</xsl:attribute>
</xsl:template>
<xsl:template match="blockquote">
<nns:fn-blockquote>
<nns:bq-para>
<xsl:apply-templates/>
</nns:bq-para>
</nns:fn-blockquote>
</xsl:template>
<xsl:template match="para" mode="group" name="makePara">
<xsl:variable name="vGroup"
select="key('kNodeByPrecedingBlock',generate-id())"/>
<xsl:if test="$vGroup">
<nns:fn-para>
<xsl:apply-templates select="$vGroup"/>
</nns:fn-para>
</xsl:if>
</xsl:template>
<xsl:template match="*" mode="group">
<xsl:apply-templates select="."/>
<xsl:call-template name="makePara"/>
</xsl:template>
</xsl:stylesheet>

输出:
<nns:footnote ref="1" xmlns:nns="nns">
<nns:fn-para>Here is some text about some guy who made
<nns:emph type="it">fascinating</nns:emph> comment I want to quote
</nns:fn-para>
<nns:fn-blockquote>
<nns:bq-para> So I went to this place and met this guy....</nns:bq-para>
</nns:fn-blockquote>
<nns:fn-para> It seemed more interesting at the time.
</nns:fn-para>
</nns:footnote>

备注 :覆盖的标识规则(仅用于样式,但它是一个很好的模式)。四个直接变换规则匹配 footnote , emphasis , @role emphasis 的属性和 blockquote .分组键匹配“内联” para的 child :第一个前面的“块”元素的生成 ID 或 para parent 。 para 的分组规则将模板应用于 "group" 中的 self 和“block”元素模式。规则匹配 para"group"模式(也称为 makePara ):如果有一个带有 的组,则输出一个段落上下文节点生成 id 作为键值。规则匹配 "group" 中的任何元素模式(它将是任何“块”元素):将模板应用于自我(“重置”模式)并调用 makePara命名模板。

关于xml - XSLT:使子节点成为上下文节点的兄弟节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5147803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com