我有一个客户希望在他的注册表中添加下拉列表,该表通过国家/地区代码列出了世界上所有省份。为此,他给了我this file。不幸的是,数据的结构不适用于我需要做的事情。以下是我想要的结构。有没有办法自动重构数据,可能是使用XSLT或类似的东西?谢谢!
<countries>
<country code="US">
<region>Alaska</region>
<region>California</region>
</country>
</countries>
答案 0 :(得分:1)
通过向XSLT标识转换添加单个模板可以轻松实现:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
<xsl:template match="countries/*">
<country code="{name()}">
<xsl:apply-templates select="region"/>
</country>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
如果我必须转换该文件,我只需编写一个快速帮助控制台应用程序,将当前文件反序列化为对应于当前格式的对象,然后只运行循环并将数据放入新对象层次结构中对应于上面的新格式,然后将其序列化为XML。
这样,如果我不得不再次重新导入同一个文件,我可以重新运行我的转换应用程序。
答案 2 :(得分:0)
也许这可以帮到你?
答案 3 :(得分:0)
您可以使用自己喜欢的正则表达式工具来转换文件。例如,在.NET中,您可以使用:
string result = Regex.Replace(Regex.Replace(input, "<(..)>", "<country code=\"$1\">"), "</..>", "</country>");
$ 1指的是第一个匹配组“(..)”匹配的字符串。
这是您的converted file
有关详细信息,请访问网站regular-expressions.info。
答案 4 :(得分:0)
我的XSLT-fu不能胜任它,但是,你可以用XSLT来做。
你实际上只是想做一件聪明的事情,那就是将国家代码标签转换为标签。
直接迭代特定节点的子节点列表,你可以得到当前节点的标签名称,你可以输出更多或更少你想要的东西......我不确定的地方(它不是什么东西)我曾经不得不这样做是获取节点名称的确切咒语。
编辑:放手的问题太好了(学习机会)
答案的缺失当然是stackoverflow
所以这给了你(基于我所知道的......我确信区域的副本可以简化,但我不知道怎么做!):
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="countries" />
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="countries">
<countries>
<xsl:for-each select="child::*">
<country code="{local-name()}">
<xsl:apply-templates select="region" />
</country>
</xsl:for-each>
</countries>
</xsl:template>
<xsl:template match="region">
<region>
<xsl:value-of select="."/>
</region>
</xsl:template>
</xsl:stylesheet>
欢迎提出改进建议 - 将酌情修改!
答案 5 :(得分:0)
我应该首先在这里查看答案(没有收到电子邮件通知),但我设法编写了一个小的ASP / VB程序来执行此操作。不过,谢谢你们的回答!如果我先在这里查看,我本可以节省一些时间。至少我有一个我现在可以重用的程序。