转换XML以便可以使用DataSet.ReadXML读取它

时间:2010-10-28 20:51:57

标签: xml xslt xpath dataset

我以相当奇怪的格式获得了一个XML文档,我需要将其加载到DataSet中,但不出所料我在尝试这样做时遇到错误。我可以看到我如何将文档转换成可以工作的东西,但是我有点像XSLT一样绕圈子...

该文件看起来像这样:

<map>
    <entry key = "status">ok</entry>
    <entry key = "pageNum">1</entry>
    <entry key = "title">DocTitle</entry>
    <entry key = "stuff">
        <map>
            <entry key = "id">171</entry>
            <entry key = "name">StackOverflow</entry>
            <entry key = "timeZone">America/New_York</entry>
        </map>
        <map>
            <entry key = "id">172</entry>
            <entry key = "name">StackOverflow2</entry>
            <entry key = "timeZone">America/New_York</entry>
        </map>
    </entry>
</map>

我想把它变成更像这样的东西:

<map>
    <status>ok</status>
    <pageNum>1</pageNum>
    <title>DocTitle</title>
    <stuff>
        <map>
            <id>171</id>
            <name>StackOverflow</name>
            <timeZone>America/New_York</timeZone>
        </map>
        <map>
            <id>172</id>
            <name>StackOverflow2</name>
            <timeZone>America/New_York</timeZone>
        </map>
    </stuff>
</map>

我已经有了所有代码来运行它通过XSLT转换并处理输出,但是我无法让转换本身产生任何合理的东西。我真的不认为这和我做的一样困难,如果一些聪明的灵魂可以把一些有用的东西扔在一起,我会永远感激。

或者只是指出一个我可以修改的例子或其他东西......

感谢。

2 个答案:

答案 0 :(得分:1)

此转化

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="entry[@key]">
   <xsl:element name="{@key}">
     <xsl:apply-templates/>
   </xsl:element>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档

<map>
    <entry key = "status">ok</entry>
    <entry key = "pageNum">1</entry>
    <entry key = "title">DocTitle</entry>
    <entry key = "stuff">
        <map>
            <entry key = "id">171</entry>
            <entry key = "name">StackOverflow</entry>
            <entry key = "timeZone">America/New_York</entry>
        </map>
        <map>
            <entry key = "id">172</entry>
            <entry key = "name">StackOverflow2</entry>
            <entry key = "timeZone">America/New_York</entry>
        </map>
    </entry>
</map>

生成想要的正确结果

<map>
    <status>ok</status>
    <pageNum>1</pageNum>
    <title>DocTitle</title>
    <stuff>
        <map>
            <id>171</id>
            <name>StackOverflow</name>
            <timeZone>America/New_York</timeZone>
        </map>
        <map>
            <id>172</id>
            <name>StackOverflow2</name>
            <timeZone>America/New_York</timeZone>
        </map>
    </stuff>
</map>

答案 1 :(得分:0)

<xsl:stylesheet 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
    exclude-result-prefixes="xs">

<xsl:template match="*">
    <xsl:copy>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

<xsl:template match="//entry">
        <xsl:variable name="key" select="@key"/>
        <xsl:element name="{$key}">
                <xsl:apply-templates/>
        </xsl:element>
</xsl:template>

</xsl:stylesheet>