如何使用XSLT将XML更改为XML

  • 本文关键字:XML 何使用 XSLT xml xslt
  • 更新时间 :
  • 英文 :


嗨,我正在尝试使用XSLT更改我的XML文档。我试着跟随其他一些关于Stack Overflow主题的线程,但我无法让它工作。我的XML文件是一个数据库导出,这是我使用的软件一次导出所有数据的唯一方法。但是导出数据的布局在我提取文件的程序中不起作用,所以在将XML导入到新程序之前,我需要更改XML的布局。

这是我的原始XML。

<?xml version="1.0" encoding="UTF-8"?>
<Log>
<DataSource>test</DataSource>
<SQLStatement>SELECT * FROM test_elementer WHERE country='FR';</SQLStatement>
<SQLStatementResult>Success</SQLStatementResult>
<SQLStatementValue>
<Row>
<Column Name="id" DataType="INTEGER">1</Column>
<Column Name="country" DataType="STRING">FR</Column>
<Column Name="city" DataType="STRING">Lyon</Column>
<Column Name="windows_1000x1000" DataType="INTEGER">1</Column>
<Column Name="windows_1000x750" DataType="INTEGER">2</Column>
<Column Name="windows_1250x1250" DataType="INTEGER">3</Column>
<Column Name="street_700x1000" DataType="INTEGER">4</Column>
</Row>
<Row>
<Column Name="id" DataType="INTEGER">2</Column>
<Column Name="country" DataType="STRING">FR</Column>
<Column Name="city" DataType="STRING">Herblay</Column>
<Column Name="windows_1000x1000" DataType="INTEGER">4</Column>
<Column Name="windows_1000x750" DataType="INTEGER">2</Column>
<Column Name="windows_1250x1250" DataType="INTEGER">3</Column>
<Column Name="street_700x1000" DataType="INTEGER">1</Column>
</Row>
<Row>
<Column Name="id" DataType="INTEGER">3</Column>
<Column Name="country" DataType="STRING">FR</Column>
<Column Name="city" DataType="STRING">Nantes</Column>
<Column Name="windows_1000x1000" DataType="INTEGER">5</Column>
<Column Name="windows_1000x750" DataType="INTEGER">3</Column>
<Column Name="windows_1250x1250" DataType="INTEGER">1</Column>
<Column Name="street_700x1000" DataType="INTEGER">4</Column>
</Row>
</SQLStatementValue>
</Log>

我需要将此XML转换为以下内容:

<data>
<store>
<id>1</id>
<country>FR</country>
<city>Lyon</city>
<windows_1000x1000>1</windows_1000x1000>
<windows_1000x750>2</windows_1000x750>
<windows_1250x1250>3</windows_1250x1250>
<windows_700x1000>4</windows_700x1000>
</store>
<store>
<id>2</id>
<country>FR</country>
<city>Herblay</city>
<windows_1000x1000>4</windows_1000x1000>
<windows_1000x750>2</windows_1000x750>
<windows_1250x1250>3</windows_1250x1250>
<windows_700x1000>1</windows_700x1000>
</store>
<store>
<id>3</id>
<country>FR</country>
<city>Nantes</city>
<windows_1000x1000>5</windows_1000x1000>
<windows_1000x750>3</windows_1000x750>
<windows_1250x1250>1</windows_1250x1250>
<windows_700x1000>4</windows_700x1000>
</store>
</data>

这是我尝试过的XSL代码:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output indent="yes"/>
<xsl:template match="/">
<data>
<xsl:apply-templates select="Log/SQLStatementValue/Row" /> 
</data>
</xsl:template>
<xsl:template match="Row">
<store>
<xsl:apply-templates select="Column[@name = 'id']"/>
<xsl:apply-templates select="Column[@name = 'country']"/>
<xsl:apply-templates select="Column[@name = 'city']"/>
<xsl:apply-templates select="Column[@name = 'windows_1000x1000']"/>
<xsl:apply-templates select="Column[@name = 'windows_1000x750']"/>
<xsl:apply-templates select="Column[@name = 'windows_1250x1250']"/>
<xsl:apply-templates select="Column[@name = 'street_700x1000']"/>
</store>
</xsl:template>
<xsl:template match="Column[@name = 'id']">
<id>
<xsl:value-of select="."/>
</id>
</xsl:template>
<xsl:template match="Column[@name = 'country']">
<country>
<xsl:value-of select="."/>
</country>
</xsl:template>
<xsl:template match="Column[@name = 'city']">
<city>
<xsl:value-of select="."/>
</city>
</xsl:template>
<xsl:template match="Column[@name = 'windows_1000x1000']">
<windows_1000x1000>
<xsl:value-of select="."/>
</windows_1000x1000>
</xsl:template>

<xsl:template match="Column[@name = 'windows_1000x750']">
<windows_1000x750>
<xsl:value-of select="."/>
</windows_1000x750>
</xsl:template>
<xsl:template match="Column[@name = 'windows_1250x1250']">
<windows_1250x1250>
<xsl:value-of select="."/>
</windows_1250x1250>
</xsl:template>
<xsl:template match="Column[@name = 'street_700x1000']">
<street_700x1000>
<xsl:value-of select="."/>
</street_700x1000>
</xsl:template>
</xsl:transform>

属性称为Name,而不是name

还请注意,您可以用通用模板规则替换单个模板规则:

<xsl:template match="Column">
<xsl:element name="{@Name}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>

最新更新