2

ファイル内の対応するレコードに対して、DB からいくつかのレコードがあります。

例 レコード番号 XML

  1. <XML_FILE_HEADER file_name="sample.txt" />
  2. <XML_RECORD record_number="1" name="John Doe" Age="21"/>
  3. <XML_RECORD record_number="2" name""Jessica Sanchez" Age="23"/>
  4. <XML_FILE_FOOTER total_records="2"/>

これで、レコードごとに、xml で出力ファイルを作成する xslt テンプレートがあります。

レコード番号 1 の場合:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xalan="http://xml.apache.org/xslt">
<xsl:output method="xml"/>
<xsl:template match="XML_FILE_HEADER">
    <xsl:element name="File">
    <xsl:attribute name="FileName"><xsl:value-of select="@file_name"/></xsl:attribute>
    </xsl:element>
  </xsl:element>
</xsl:template>
</xsl:stylesheet>

レコード 2 と 3 の場合:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xalan="http://xml.apache.org/xslt">
     <xsl:output omit-xml-declaration="yes"/>
     <xsl:template match="XML_RECORD">
       <xsl:element name="Record">
        <xsl:attribute name="Name"><xsl:value-of select="@name"/></xsl:attribute>
        <xsl:element name="Details">
        <xsl:attribute name="Age"><xsl:value-of select="@Age"/></xsl:attribute>
        </xsl:element>
      </xsl:element>
     </xsl:template>
</xsl:stylesheet>

レコード 4 の場合:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xalan="http://xml.apache.org/xslt">
     <xsl:output omit-xml-declaration="yes"/>
     <xsl:template match="XML_FILE_FOOTER">
       <xsl:element name="Totals">
        <xsl:attribute name="Total Records"><xsl:value-of select="@total_records"/></xsl:attribute>
      </xsl:element>
     </xsl:template>
</xsl:stylesheet>

問題は、上記のテンプレートを使用して各レコードを追加した後に、この出力が得られることです。

<?xml version="1.0" encoding="UTF-8"?>
<File FileName="sample.txt"></File>
<Record Name="John Doe" Age="21"></Record>
<Record Name="Jessica Sanchez" Age="22"></Record>
<Totals Total Records="2"></Totals>

File の下に Record 要素と Totals 要素を挿入するにはどうすればよいですか? 次のような出力が得られるようにします。

<?xml version="1.0" encoding="UTF-8"?>
<File FileName="sample.txt">
<Record Name="John Doe" Age="21"></Record>
<Record Name="Jessica Sanchez" Age="22"></Record>
<Totals Total Records="2"></Totals>
</File>

どんな助けでも大歓迎です。ありがとう。

4

2 に答える 2

2

これと同じくらい短くて簡単

<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:apply-templates select="XML_FILE_HEADER"/>
 </xsl:template>

 <xsl:template match="XML_FILE_HEADER">
   <File FileName="{@file_name}">
     <xsl:apply-templates select="../*[not(self::XML_FILE_HEADER)]"/>
   </File>
 </xsl:template>

 <xsl:template match="XML_RECORD">
   <Record name="{@name}" Age="{@Age}"/>
 </xsl:template>

 <xsl:template match="XML_FILE_FOOTER">
   <Totals TotalRecords="{@total_records}"/>
 </xsl:template>
</xsl:stylesheet>

この変換が提供されたXML(整形式になるように修正された)ドキュメントに適用される場合:

<t>
    <XML_FILE_HEADER file_name="sample.txt" />
    <XML_RECORD record_number="1" name="John Doe" Age="21"/>
    <XML_RECORD record_number="2" name="Jessica Sanchez" Age="23"/>
    <XML_FILE_FOOTER total_records="2"/>
</t>

必要な正しい結果が生成されます:

<File FileName="sample.txt">
   <Record name="John Doe" Age="21"/>
   <Record name="Jessica Sanchez" Age="23"/>
   <Totals TotalRecords="2"/>
</File>

説明

  1. テンプレートの適切な使用。

  2. xsl:apply-templates結果を注文するためのの適切な使用。

  3. AVT(属性値テンプレート)の適切な使用。

  4. の使用を避けたxsl:element

  5. の使用はありませんxsl:call-template

  6. 「プッシュスタイル」でほぼ完全に実装されています。

于 2012-08-31T12:26:22.643 に答える
0

あなたが欲しいのは<xsl:call-template name="templatename" />要素です。これにより、別のテンプレート内からテンプレートを呼び出すことができます。

何かのようなもの

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xalan="http://xml.apache.org/xslt">
    <xsl:output method="xml"/>
    <xsl:template match="/XML_FILE/XML_FILE_HEADER">
      <xsl:element name="File">
        <xsl:attribute name="FileName">
          <xsl:value-of select="@file_name"/>
        </xsl:attribute>
        <xsl:for-each select="/XML_FILE/XML_RECORD">
          <xsl:call-template name="RecordTemplate" />
        </xsl:for-each>        
        <xsl:call-template name="TotalTemplate" />
      </xsl:element>
    </xsl:template>

    <xsl:template name="RecordTemplate">
      <xsl:element name="Record">
        <xsl:attribute name="Name"><xsl:value-of select="@name"/></xsl:attribute>
        <xsl:attribute name="Age"><xsl:value-of select="@Age"/></xsl:attribute>
      </xsl:element>
    </xsl:template>

    <xsl:template match="/XML_FILE/XML_FILE_FOOTER" name="TotalTemplate">
      <xsl:element name="Totals">
          <xsl:attribute name="Total Records"><xsl:value-of select="@total_records"/>
      </xsl:element>
    </xsl:template>
</xsl:stylesheet>

もちろん、あなたの入力はXML有効でなければなりません(つまり、単一のルートノードを持っています)

<XML_FILE>
  <XML_FILE_HEADER file_name="sample.txt" />
  <XML_RECORD record_number="1" name="John Doe" Age="21"/>
  <XML_RECORD record_number="2" name""Jessica Sanchez" Age="23"/>
  <XML_FILE_FOOTER total_records="2"/>
</XML_FILE>
于 2012-08-31T09:07:09.330 に答える