【问题标题】:Transforming XML so it can be read with DataSet.ReadXML转换 XML 以便可以使用 DataSet.ReadXML 读取
【发布时间】:2010-10-29 05:53:09
【问题描述】:

我收到了一个格式很奇怪的 XML 文档,我需要将它加载到 DataSet 中,但不出所料,当我尝试这样做时会出错。我可以看到如何将文档转换为可以工作的东西,但我有点绕着 XSLT 的东西兜圈子......

文档看起来像这样:

    ok1文档标题171StackOverflow美国/纽约地图>
        
            172StackOverflow2美国/纽约地图>
    

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

    正常状态>
    1文档标题171堆栈溢出美国/纽约地图>
        
            172StackOverflow2美国/纽约地图>
    东西>

我已经准备好通过 XSLT 转换运行它并处理输出的所有代码,但我无法让转换本身产生任何合理的东西。我真的不认为这有我做的那么难,如果某个聪明的人能拼凑出一些可行的东西,我将永远感激不尽。

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

谢谢。

【问题讨论】:

  • 好问题,+1。请参阅我的答案以获得简短而完整的解决方案。 :)

标签: xml xslt xpath dataset


【解决方案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>

【讨论】:

  • 哇!这正是我所需要的 - 也是快速响应!
  • @Miszou:很高兴这个解决方案很有用。在 SO 表达感激的方式是接受和支持答案。 :)
  • 我想说“谢谢!”同样,但是当我输入新行时,评论被接受了,我似乎无法再次取回它。显然,我不小心退出了或发生了什么奇怪的事情......无论如何,再次感谢! (并赞成!)
【解决方案2】:
<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>

【讨论】:

  • 使用代码标记。模式中不需要起始 // 运算符。
  • 为什么选择 XSLT 2.0?没有 XSLT 2.0 - 您的解决方案中只使用了功能。在所有这些情况下,最好将解决方案表示为 XSLT 1.0,这样很明显大多数读者都可以使用它。
猜你喜欢
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
  • 2017-06-05
  • 1970-01-01
  • 2017-01-25
  • 2021-12-17
相关资源
最近更新 更多