0

我编写了一个 XSLT 文件来将 XML 文件从非结构化格式转换为更结构化的格式。但问题是我在目录/子目录结构中存在数千个 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>

我正在寻找 Java 或 C# 中的解决方案,因为我必须将新生成的 XML 文件转换为可以执行 SQL 查询的 RDBMS。

先感谢您。

4

1 回答 1

0

如果您想从 Java 运行它,那么您可以读取 Java 中的目录结构并为每个文件调用一次 transform() ,假设(据我了解)每个输入文件都独立于任何其他文件转换为输出文件。

或者,您可以从 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="."/>
    </
  </
</

然后开始转换,指定“main”作为初始模板,而不提供源文档。

于 2013-01-28T21:29:33.007 回答