1

XML/XSLT 新手在这里。我有一些需要比较的数据集。输出需要是不在当前名册中的名册的先前成员的列表。该节点包含两组元素,我需要循环浏览并将缺少的成员放入 csv 文件中。在下面的示例中,Kerry Smith 被列为“Previous_Members”而不是“Member”,因此她需要在输出中列出。

相同的结构将发生在多个团队中。不同的团队可以有不同的#。(史密斯队可能有 4 名成员,琼斯队可能有 7 名成员,杰克逊队可能有 10 名成员,等等。)所以解决方案需要能够处理可变数量的元素。

这对我的经验来说是一个很大的延伸,所以任何指导都将不胜感激。

<?xml version="1.0" encoding="UTF-8"?>
<am:Team>
<am:First_Day>08/24/2012</am:First_Day>
<am:_Date>08/23/2012</am:_Date>
<am:Member am:Descriptor="Clare Smith">
    <am:ID am:type="Member_ID">4588-D4</am:ID>
</am:Member>
<am:Members am:Descriptor="Jack Smith">
    <am:ID am:type="Member_ID">4588-D3</am:ID>
</am:Members>
<am:Members am:Descriptor="Colin Smith">
    <am:ID am:type="Member_ID">4588-D2</am:ID>
</am:Members>
<am:Previous_Members am:Descriptor="Kerry Smith">
    <am:ID am:type="Member_ID">4588-D1</am:ID>
</am:Previous_Members>
<am:Previous_Members am:Descriptor="Colin Smith">
    <am:ID am:type="Member_ID">4588-D2</am:ID>
</am:Previous_Members>
<am:Previous_Members am:Descriptor="Jack Smith">
    <am:ID am:type="Member_ID">4588-D3</am:ID>
</am:Previous_Members>
<am:Previous_Members am:Descriptor="Clare Smith">
    <am:ID am:type="Member_ID">4588-D4</am:ID>
</am:Previous_Members>

4

1 回答 1

1

使用

/*/am:Previous_Members[not(am:ID=/*/am:Member/am:ID)]

这将选择 ID 不是当前成员 ID 的所有以前的团队成员。

仅将模板应用于此 XPath 表达式选择的元素。

更新

所提供的 XML 文档同时包含:am:Memberam:Members-- 这可能是一个输入错误。

更正上述内容,使只有am:Members,XML 文档变为

<am:Team xmlns:am="some:am">
    <am:First_Day>08/24/2012</am:First_Day>
    <am:_Date>08/23/2012</am:_Date>
    <am:Members am:Descriptor="Clare Smith">
        <am:ID am:type="Member_ID">4588-D4</am:ID>
    </am:Members>
    <am:Members am:Descriptor="Jack Smith">
        <am:ID am:type="Member_ID">4588-D3</am:ID>
    </am:Members>
    <am:Members am:Descriptor="Colin Smith">
        <am:ID am:type="Member_ID">4588-D2</am:ID>
    </am:Members>
    <am:Previous_Members am:Descriptor="Kerry Smith">
        <am:ID am:type="Member_ID">4588-D1</am:ID>
    </am:Previous_Members>
    <am:Previous_Members am:Descriptor="Colin Smith">
        <am:ID am:type="Member_ID">4588-D2</am:ID>
    </am:Previous_Members>
    <am:Previous_Members am:Descriptor="Jack Smith">
        <am:ID am:type="Member_ID">4588-D3</am:ID>
    </am:Previous_Members>
    <am:Previous_Members am:Descriptor="Clare Smith">
        <am:ID am:type="Member_ID">4588-D4</am:ID>
    </am:Previous_Members>
</am:Team>

XPath 表达式变为

/*/am:Previous_Members[not(am:ID=/*/am:Members/am:ID)]

而且,为了方便 OP,这里是一个完整的转换,它准确地复制了想要的节点:

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

 <xsl:template match="am:Team/*"/>

 <xsl:template match="am:Previous_Members[not(am:ID=/*/am:Members/am:ID)] ">
     <xsl:copy-of select="."/>
 </xsl:template>
</xsl:stylesheet>

当对上述 XML 文档应用此转换时,会产生所需的正确结果

<am:Previous_Members xmlns:am="some:am" am:Descriptor="Kerry Smith">
   <am:ID am:type="Member_ID">4588-D1</am:ID>
</am:Previous_Members>
于 2012-09-20T13:51:28.737 回答