0

大きな XML ファイルがあり、ノード セット全体 (PRESOL、COMBINE、および FAIROPS) をループし、DATE という名前のすべての子ノードを削除する XSLT を作成しようとしています。次に、親ノードの DATE を mm/dd/yyyy に再フォーマットします。これが私のコードです。バージョン1.0を使用しています:

<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="DATE">
    <xsl:text>
    </xsl:text>
    <xsl:text disable-output-escaping="yes">&lt;</xsl:text>
    <xsl:value-of select="name()"/>
    <xsl:text disable-output-escaping="yes">&gt;</xsl:text>
    <xsl:value-of select="concat(substring(., 1, 2), '/', substring(., 3, 2), '/', substring(., 5, 4))"/>
    <xsl:text disable-output-escaping="yes">&lt;/</xsl:text>
    <xsl:value-of select="name()"/>
    <xsl:text disable-output-escaping="yes">&gt;</xsl:text>
    <xsl:text>
    </xsl:text>
</xsl:template>
<xsl:template match="node()|@*">
    <xsl:copy> 
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="DATE[preceding::DATE]"/>

ノードセット全体をループする方法を理解するのに苦労しています。親ノード名をハードコーディングしないことを望んでいます。現在、私のコードは最初の親ノードのみを処理しています。また、親ノードに子がない場合、私のコードはその DATE ノードを削除していますが、その理由がわかりません。どんな助けでも大歓迎です。

私の入力

 <NOTICES>
  <PRESOL>
   <DATE>01242013</DATE>
   <AGENCY><![CDATA[Department of the Interior]]></AGENCY>
   <OFFICE><![CDATA[Fish and Wildlife Service]]></OFFICE>
   <LOCATION><![CDATA[CGS-WO]]></LOCATION>
   <ZIP>97232</ZIP>
   <CHANGES>
    <MOD>
     <DATE>01242013</DATE>
     <AGENCY><![CDATA[Department of the Interior]]></AGENCY>
     <OFFICE><![CDATA[Fish and Wildlife Service]]></OFFICE>
     <LOCATION><![CDATA[CGS-WO]]></LOCATION>
     <ZIP>97232</ZIP>
    </MOD>
   </CHANGES>
  </PRESOL>
  <COMBINE>
    <DATE>02102013</DATE>
    <AGENCY><![CDATA[Department of the Air Force]]></AGENCY>
    <OFFICE><![CDATA[Air Force Materiel Command]]></OFFICE>
    <LOCATION><![CDATA[Tinker OC-ALC  -  (Central Contracting)]]></LOCATION>
    <ZIP>73145-3015</ZIP>
  </COMBINE>
  <COMBINE>
   <DATE>02092013</DATE>
   <AGENCY><![CDATA[Department of the Navy]]></AGENCY>
   <OFFICE><![CDATA[Military Sealift Command]]></OFFICE>
   <LOCATION><![CDATA[MSC Norfolk]]></LOCATION>
  </COMBINE>
  <COMBINE>
   <DATE>02092013</DATE>
   <AGENCY><![CDATA[Department of Veterans Affairs]]></AGENCY>
   <OFFICE><![CDATA[Grand Junction VAMC)]]></OFFICE>
   <LOCATION><![CDATA[Veterans Affairs Medical Center]]></LOCATION>
  </COMBINE>
  <PRESOL>
   <DATE>12272012</DATE>
   <AGENCY><![CDATA[Department of the Air Force]]></AGENCY>
   <OFFICE><![CDATA[Pacific Air Forces]]></OFFICE>
   <LOCATION><![CDATA[354 CONS - Eielson]]></LOCATION>
   <CHANGES>
    <MOD>
     <DATE>01112013</DATE>
     <AGENCY><![CDATA[Department of the Air Force]]></AGENCY>
     <OFFICE><![CDATA[Pacific Air Forces]]></OFFICE>
     <LOCATION><![CDATA[354 CONS - Eielson]]></LOCATION>
    </MOD>
   <MOD>
    <DATE>01112013</DATE>
    <AGENCY><![CDATA[Department of the Air Force]]></AGENCY>
    <OFFICE><![CDATA[Pacific Air Forces]]></OFFICE>
    <LOCATION><![CDATA[354 CONS - Eielson]]></LOCATION>
   </MOD>
   <MOD>
    <DATE>01142013</DATE>
    <AGENCY><![CDATA[Department of the Air Force]]></AGENCY>
    <OFFICE><![CDATA[Pacific Air Forces]]></OFFICE>
    <LOCATION><![CDATA[354 CONS - Eielson]]></LOCATION>
   </MOD>
   <MOD>
    <DATE>01142013</DATE>
    <AGENCY><![CDATA[Department of the Air Force]]></AGENCY>
    <OFFICE><![CDATA[Pacific Air Forces]]></OFFICE>
    <LOCATION><![CDATA[354 CONS - Eielson]]></LOCATION>
   </MOD>
  </CHANGES>
 </PRESOL>
 <FAIROPP>
  <DATE>02082013</DATE>
  <AGENCY><![CDATA[Department of the Navy]]></AGENCY>
  <OFFICE><![CDATA[Bureau of Medicine and Surgery]]></OFFICE>
  <LOCATION><![CDATA[NH Camp Pendleton]]></LOCATION>
  <ZIP>92055</ZIP>
  <CHANGES>
   <MOD>
    <DATE>02122011</DATE>
    <AGENCY><![CDATA[Department of the Navy]]></AGENCY>
    <OFFICE><![CDATA[Pacific Air Forces]]></OFFICE>
    <LOCATION><![CDATA[354 CONS - Eielson]]></LOCATION>
   </MOD>
  </CHANGES>
 </FAIROPP>
</NOTICES>

望ましい出力:

<NOTICES>
<PRESOL>
 <DATE>01/24/2013</DATE>
 <AGENCY><![CDATA[Department of the Interior]]></AGENCY>
 <OFFICE><![CDATA[Fish and Wildlife Service]]></OFFICE>
 <LOCATION><![CDATA[CGS-WO]]></LOCATION>
 <ZIP>97232</ZIP>
 <CHANGES>
  <MOD>
   <AGENCY><![CDATA[Department of the Interior]]></AGENCY>
   <OFFICE><![CDATA[Fish and Wildlife Service]]></OFFICE>
   <LOCATION><![CDATA[CGS-WO]]></LOCATION>
   <ZIP>97232</ZIP>
  </MOD>
 </CHANGES>
</PRESOL>
<COMBINE>
 <DATE>02/10/2013</DATE>
 <AGENCY><![CDATA[Department of the Air Force]]></AGENCY>
 <OFFICE><![CDATA[Air Force Materiel Command]]></OFFICE>
 <LOCATION><![CDATA[Tinker OC-ALC  -  (Central Contracting)]]></LOCATION>
 <ZIP>73145-3015</ZIP>
</COMBINE>
<COMBINE>
 <DATE>02/09/2013</DATE>
 <AGENCY><![CDATA[Department of the Navy]]></AGENCY>
 <OFFICE><![CDATA[Military Sealift Command]]></OFFICE>
 <LOCATION><![CDATA[MSC Norfolk]]></LOCATION>
</COMBINE>
<COMBINE>
 <DATE>02/09/2013</DATE>
 <AGENCY><![CDATA[Department of Veterans Affairs]]></AGENCY>
 <OFFICE><![CDATA[Grand Junction VAMC)]]></OFFICE>
 <LOCATION><![CDATA[Veterans Affairs Medical Center]]></LOCATION>
</COMBINE>
<PRESOL>
 <DATE>12/27/2012</DATE>
 <AGENCY><![CDATA[Department of the Air Force]]></AGENCY>
 <OFFICE><![CDATA[Pacific Air Forces]]></OFFICE>
 <LOCATION><![CDATA[354 CONS - Eielson]]></LOCATION>
 <CHANGES>
  <MOD>
   <AGENCY><![CDATA[Department of the Air Force]]></AGENCY>
   <OFFICE><![CDATA[Pacific Air Forces]]></OFFICE>
   <LOCATION><![CDATA[354 CONS - Eielson]]></LOCATION>
  </MOD>
  <MOD>
   <AGENCY><![CDATA[Department of the Air Force]]></AGENCY>
   <OFFICE><![CDATA[Pacific Air Forces]]></OFFICE>
   <LOCATION><![CDATA[354 CONS - Eielson]]></LOCATION>
  </MOD>
  <MOD>
   <AGENCY><![CDATA[Department of the Air Force]]></AGENCY>
   <OFFICE><![CDATA[Pacific Air Forces]]></OFFICE>
   <LOCATION><![CDATA[354 CONS - Eielson]]></LOCATION>
  </MOD>
  <MOD>
   <AGENCY><![CDATA[Department of the Air Force]]></AGENCY>
   <OFFICE><![CDATA[Pacific Air Forces]]></OFFICE>
   <LOCATION><![CDATA[354 CONS - Eielson]]></LOCATION>
  </MOD>
 </CHANGES>
</PRESOL>
<FAIROPP>
 <DATE>02/08/2013</DATE>
 <AGENCY><![CDATA[Department of the Navy]]></AGENCY>
 <OFFICE><![CDATA[Bureau of Medicine and Surgery]]></OFFICE>
 <LOCATION><![CDATA[NH Camp Pendleton]]></LOCATION>
 <ZIP>92055</ZIP>
 <CHANGES>
  <MOD>
   <AGENCY><![CDATA[Department of the Navy]]></AGENCY>
   <OFFICE><![CDATA[Pacific Air Forces]]></OFFICE>
   <LOCATION><![CDATA[354 CONS - Eielson]]></LOCATION>
  </MOD>
 </CHANGES>
</FAIROPP>
</NOTICES>
4

1 に答える 1

0

DATE[preceding::DATE]preceding軸には現在のノードの先祖ではないノードが含まれているため、正しくありません。したがって、これはドキュメント全体の最初の DATE 以外のすべてのDATEに一致します。あなたが言いたいのは、「現在の DATE 要素の親にも DATE 要素があります」ということです。

<xsl:template match="DATE[../ancestor::*/DATE]"/>

これは、コンテキスト ノード (祖先のいずれかに DATE 要素があるかどうか..を確認している現在の要素) と一致しないようにするためです。DATE

ところで、新しい要素を作成する方法はひどいものです。代わりにこれを使用してください:

<xsl:template match="DATE">
    <xsl:element name="{name()}">
        <xsl:value-of select="concat(substring(., 1, 2), '/', substring(., 3, 2), '/', substring(., 5, 4))"/>
    </xsl:element>
</xsl:template>

あなたの場合は必要ではありませんが、テンプレートをテキストノードと直接一致させるだけです:

<xsl:template match="DATE/text()">
    <xsl:value-of select="concat(substring(., 1, 2), '/', substring(., 3, 2), '/', substring(., 5, 4))"/>
</xsl:template>

テンプレートの最終バージョン:

<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="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="DATE/text()">
        <xsl:value-of select="concat(substring(., 1, 2), '/', substring(., 3, 2), '/', substring(., 5, 4))"/>
    </xsl:template>

    <xsl:template match="DATE[../ancestor::*/DATE]"/>

</xsl:stylesheet>
于 2013-02-17T03:26:01.470 に答える