1

XML/XSLT初心者はこちら。比較する必要があるデータのセットがいくつかあります。出力は、現在の名簿にない名簿の以前のメンバーのリストである必要があります。Node には両方の要素セットが含まれており、循環して不足しているメンバーを 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 に答える