gpt4 book ai didi

java - 复制引用的 XML 元素

转载 作者:行者123 更新时间:2023-12-02 02:09:26 27 4
gpt4 key购买 nike

我有一个源 XML 文档,看起来像这样:

<root>
<users>
<user id="1" name="user 1" />
<user id="2" name="user 2" />
<user id="3" name="user 3" />
</users>
<posts>
<post>
<user>1</user>
<text>First sample post!</text>
<status>DELETED</status>
</post>
<post>
<user>2</user>
<text>Second sample post!</text>
<status>ACTIVE</status>
</post>
<post>
<user>3</user>
<text>Third sample post!</text>
<status>DELETED</status>
</post>
</posts>
</root>

我需要过滤用户,以便目标文档仅包含 ACTIVE 帖子和帖子元素中引用的用户。:

<root>
<users>
<user id="2" name="user 2" />
</users>
<posts>
<post>
<user>2</user>
<text>Second sample post!</text>
</post>
</posts>
</root>

我无权更改源文档,并且我需要使用 XSLT(我对此非常陌生)来实现此目的。

我可以轻松过滤帖子,但我不确定如何建立用户列表。

在我进一步讨论之前,我想检查一下这是否可行。

干杯

最佳答案

首先您应该了解身份模板

<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

它本身将完全从源文档复制到所有节点。

这意味着,不要考虑您需要复制的内容,而是考虑您不需要复制的内容。这是通过添加具有更高优先级的模板来实现的,这些模板会覆盖身份模板。

您不希望 post 元素的 status 不是“ACTIVE”吗?只需有一个空模板即可阻止它们被复制。

<xsl:template match="post[status!='ACTIVE']" />

类似地,用于删除 status 节点本身(对于它复制的帖子)

<xsl:template match="status" />

对于您的 user 元素,请考虑使用 xsl:key 查找 post 元素

<xsl:key name="posts" match="post" use="user" />

然后,您忽略用户的模板将是这样的......

<xsl:template match="user[key('posts', @id)/status!='ACTIVE']" />

把这些放在一起就可以得到这个......

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*" />

<xsl:key name="posts" match="post" use="user" />

<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="post[status!='ACTIVE']" />

<xsl:template match="status" />

<xsl:template match="user[key('posts', @id)/status!='ACTIVE']" />
</xsl:stylesheet>

关于java - 复制引用的 XML 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50236515/

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