0

XML ファイルを非構造化形式からより構造化された形式に変換する XSLT ファイルを作成しました。しかし、問題は、ディレクトリ/サブディレクトリ構造に何千もの XML ファイルが存在し、それらすべてに同じ XSLT を適用して、それらに対応する新しい構造化 XML を生成したいことです。Collection() を使用して試しましたが、うまくいきませんでした。Altova XMLSpy を使用しています。

XML ファイルは次のようになります。

<University xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 SchemaVersion="1.0.8">
 <UniName>StackOverflow</UniName>
 <UniId>123</UniId>
 <Courses>
  <Course>
   <ID>1001</ID>
   <Seats>10</Seats>
   <Description>Department: CS , Faculty: XYZ</Description>
  </Course>
  <Course>
   <ID>1001</ID>
   <Seats>10</Seats>
   <Description>To teach how to Write XSLT</Description>
  </Course>
  <Address>Planet No.# 3 Earth</Address>
  <ZipCode>007</ZipCode>
 </Courses>
</University>

対応する XSLT ファイルは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"   
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-
functions" exclude-result-prefixes="xs fn">

<xsl:output method="xml" encoding="UTF-8" indent="yes"/> 
<xsl:template match="/">
  <ConnectUni>
<xsl:for-each select="University">
  <xsl:variable name="var1_resultof_first" as="node()" select="Courses"/>
     <Address>
        <xsl:sequence select="fn:string($var1_resultof_first/Address)"/>
     </Address>
         <Courses>
     <xsl:for-each select="$var1_resultof_first/Course">
        <Course>
      <Id>
                 <xsl:sequence select="fn:string(ID)"/>
      </Id>
      <Seats>
         <xsl:sequence select="fn:string(Seats)"/>
      </Seats>
         <xsl:apply-templates select="Description"></xsl:apply-templates>
          </Course>
    </xsl:for-each>
  </Courses> 
   </xsl:for-each>
 </ConnectUni>
</xsl:template>
<xsl:template match="Description">
  <xsl:analyze-string select="." regex="Department:\s*(.+)\s*,\s*Faculty:\s*(.+)">
    <xsl:matching-substring>
      <xsl:element name="Department"><xsl:value-of select="fn:string(regex-group(1))"/>
      </xsl:element>
      <xsl:element name="Faculty"><xsl:value-of select="fn:string(regex-group(2))"/>
      </xsl:element>
    </xsl:matching-substring>
    <xsl:non-matching-substring>
      <xsl:element name="Description"><xsl:value-of select="fn:string(.)"/>
      </xsl:element>
    </xsl:non-matching-substring>
   </xsl:analyze-string>
 </xsl:template>
</xsl:stylesheet>

新しく生成された XML ファイルを SQL クエリを実行できる RDBMS に変換する必要があるため、Java または C# でのソリューションを探しています。

前もって感謝します。

4

1 に答える 1

0

Java から実行する場合は、Java でディレクトリ構造を読み取り、transform() を各ファイルに対して 1 回呼び出すことができます (私が理解しているように)、各入力ファイルは他のファイルとは無関係に出力ファイルに変換されます。

または、XSLT 内から制御することもできます。Saxon を想定すると、テンプレート ルールを追加します。

<xsl:template name="main">
  <xsl:for-each select="collection(concat($directory, '?select=*.xml;recurse=yes'))">
    <xsl:result-document href="{......}">
       <xsl:apply-templates select="."/>
    </
  </
</

次に、ソース ドキュメントを指定せずに、「メイン」を初期テンプレートとして指定して変換を開始します。

于 2013-01-28T21:29:33.007 に答える