gpt4 book ai didi

xml - 使用自定义标记语言过滤 XML 数据

转载 作者:数据小太阳 更新时间:2023-10-29 02:41:56 25 4
gpt4 key购买 nike

我正在尝试编写一个可以帮助从另一个 XML 文档中过滤数据的文档。例如。

<document>
<filter>
<what>
<include>
<marital_staus/>
<ms>single</ms> <!--nog = no of groups-->
<include>
<memberofgroups/>
<gn>Football club</gn> <!--user is a member of this club-->
</include>
</include>
</what>
</filter>

<users>
<user>
<name>
<first>abc</first>
<last>xyz</last>
</name>
<dob>12/02/1987</dob>
<marital_status>married</marital_status>
<groups>
<member_of_group>Chess Club</member_of_group>
<member_of_group>Football club</member_of_group>
</groups>
</user>

<user>
<name>
<first>aaa</first>
<last>bbb</last>
</name>
<dob>14/03/1987</dob>
<marital_status>single</marital_status>
<groups>
<member_of_group>Chess Club</member_of_group>
<member_of_group>Football club</member_of_group>
</groups>
</user>

<user>
<name>
<first>fff</first>
<last>nnn</last>
</name>
<dob>12/6/1983</dob>
<marital_status>single</marital_status>
<groups>
<member_of_group>Chess Club</member_of_group>
<member_of_group>Cultural Association</member_of_group>
</groups>
</user>
</users>
</document>

我想要这段代码做的是首先选择足球俱乐部成员(member)的用户,然后从中选择单例用户。但我无法弄清楚如何为此编写样式表。我写了这个:

<xsl:template name="temp">
<xsl:param name="a1"/>
<xsl:param name="pro"/>
<xsl:choose>
<xsl:when test="$pro = 'marital_status'">
<xsl:for-each select="/document/users/user">
<xsl:if test="marital_status=$a1">
<xsl:value-of select="."/>
</xsl:if>
</xsl:for-each>
</xsl:when>
<xsl:when test="$pro = 'memberofgroups'">
<xsl:for-each select="/document/users/user">
<xsl:for-each select="./groups/member_of_group">
<xsl:if test=".=$a1">
<xsl:value-of select="."/>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template match="include">
<xsl:call-template name="temp">
<xsl:with-param name="a1">
<xsl:apply-templates select="*[2]"/>
</xsl:with-param>
</xsl:call-template>
</xsl:template>

在调用模板时,我传递了我认为正确的值。

问题是我得到了所有单例用户,以及属于该特定组的所有用户。但是我想要同时也是足球俱乐部成员的单例用户。我不希望样式表被硬编码,因为我还想根据其他元素进行过滤。

我不知道如何将过滤后的元素保存到可以用作下一个 XPath 表达式的输入的内容中。或者我在编写过滤文档的约束时犯了一些错误。或者是否有任何其他更合适的方式来编写用于过滤的文档?我将非常感谢你的帮助。

最佳答案

使用:

   /*/*/user
[*[name() = name(/*/filter/*/include/*[1])]
=
/*/filter/*/include/*[2]
and
groups/*[name() = name(/*/filter/*/include/include/*[1])]
=
/*/filter/*/include/include/*[2]
]

基于 XSLT 的验证:

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

<xsl:template match="/">
<xsl:copy-of select=
"/*/*/user
[*[name() = name(/*/filter/*/include/*[1])]
=
/*/filter/*/include/*[2]
and
groups/*[name() = name(/*/filter/*/include/include/*[1])]
=
/*/filter/*/include/include/*[2]
]
"/>
</xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时(更正了一些拼写错误):

<document>
<filter>
<what>
<include>
<marital_status/>
<ms>single</ms>
<!--nog = no of groups-->
<include>
<member_of_group/>
<gn>Football club</gn>
<!--user is a member of this club-->
</include>
</include>
</what>
</filter>
<users>
<user>
<name>
<first>abc</first>
<last>xyz</last>
</name>
<dob>12/02/1987</dob>
<marital_status>married</marital_status>
<groups>
<member_of_group>Chess Club</member_of_group>
<member_of_group>Football club</member_of_group>
</groups>
</user>
<user>
<name>
<first>aaa</first>
<last>bbb</last>
</name>
<dob>14/03/1987</dob>
<marital_status>single</marital_status>
<groups>
<member_of_group>Chess Club</member_of_group>
<member_of_group>Football club</member_of_group>
</groups>
</user>
<user>
<name>
<first>fff</first>
<last>nnn</last>
</name>
<dob>12/6/1983</dob>
<marital_status>single</marital_status>
<groups>
<member_of_group>Chess Club</member_of_group>
<member_of_group>Cultural Association</member_of_group>
</groups>
</user>
</users>
</document>

上面的 XPath 表达式被计算并且被选择的节点(在本例中只是一个节点)被复制到输出:

<user>
<name>
<first>aaa</first>
<last>bbb</last>
</name>
<dob>14/03/1987</dob>
<marital_status>single</marital_status>
<groups>
<member_of_group>Chess Club</member_of_group>
<member_of_group>Football club</member_of_group>
</groups>
</user>

关于xml - 使用自定义标记语言过滤 XML 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10677235/

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