使用XSLT 2.0创建文件夹结构

时间:2014-10-23 12:01:50

标签: xml xslt xslt-1.0 xslt-2.0

我正在尝试创建一个样式表来将XML转换为XML的其他格式,并且在此过程中它应该创建多个放置在不同文件夹中的XML文件。我试图使用的XML文件非常大(约50000行),我想自动化它。我想像这样转换的XML

XML:

<Site> <View name="big_bang"> <Element name="Galaxy"> <Property value="milky_way"/> <Element localizedName="Earth"> <Property localizedName="Adresse" value="1"/> </Element> </Element> </View> <View name="more_big_bang"> <Element name="Galaxy"> <Property value="orion"/> <Element localizedName="otherEarth"> <Property localizedName="otherAdresse" value="10"/> </Element> </Element> </View> </Site>

XSLT:

<xsl:template match="Outside"> <xsl:apply-templates select="//Site"/> </xsl:template>

`<xsl:template match="Site">
    <xsl:result-document method="xml" href="{string-join(ancestor-or-self::Site/@name, '/')}/test.xml"> 
        <GraphicsTree>
            <xsl:copy-of select="."/>
        </GraphicsTree>
    </xsl:result-document>
</xsl:template>`

XSLT应为每个子节点创建一个文件夹,其名称为namelocalizedName,因此每个文件夹中应包含小型XML,副本为Property。但不是这样,我得到一个foder和一个XML文件,并将整个xml文件复制到它。我也使用SAXON处理器。

1 个答案:

答案 0 :(得分:2)

根据我之前的建议,我认为对于这种XML,您需要一种类似

的方法
<xsl:template match="Site">
  <xsl:apply-templates select="//Element[@name | @localizedName]"/>
</xsl:template>

<xsl:template match="Element">
  <xsl:result-document href="{string-join(ancestor-or-self::Element[@name | @localizedName]/(if (@name) then @name else @localizedName), '/')}/properties.xml">
    <root>
      <xsl:copy-of select="Property"/>
    </root>
  </xsl:result-document>
</xsl:template>