【问题标题】:Transform xml to xml using XSLT - Advices使用 XSLT 将 xml 转换为 xml - 建议
【发布时间】:2016-06-10 23:32:50
【问题描述】:

我有一个XML 文件:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Cars>
    <Car>
        <Color>Blue</Color>
        <Model>Car2</Model>
        <Year>1988</Year>
        <Speed>250</Speed>
    </Car>
    <Car>
        <Color>Blue</Color>
        <Model>Car2</Model>
        <Year>1988</Year>
        <Speed>250</Speed>
    </Car>
</Cars>

我想使用 XSLT 来转换它:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<vehicles>
    <vehicle>
        <vehicleColor>Blue</vehicleColor>
        <vehicleModel>Car2</vehicleModel>
        <vehicleYear>1988</vehicleYear>
        <vehicleSpeed>250</vehicleSpeed>
    </vehicle>
    <vehicle>
        <vehicleColor>Blue</vehicleColor>
        <vehicleModel>Car2</vehicleModel>
        <vehicleYear>1988</vehicleYear>
        <vehicleSpeed>250</vehicleSpeed>
    </vehicle>
</vehicles>

我的XSLT 文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">

        <vehicles>
            <xsl:for-each select="Cars/Car">

                <vehicle>
                    <vehicleColor><xsl:value-of select="Color"/></vehicleColor>
                    <vehicleModel><xsl:value-of select="Model"/></vehicleModel>
                    <vehicleYear><xsl:value-of select="Year"/></vehicleYear>
                    <vehicleSpeed><xsl:value-of select="Speed"/></vehicleSpeed>
                </vehicle>

            </xsl:for-each>
        </vehicles>

    </xsl:template>

</xsl:stylesheet>

它有效,但我想知道我的XSLT 文件是否正确,如果不正确,我需要建议。

另外,在使用XSLT 生成的输出文件中,我没有XML 标头。为什么?

【问题讨论】:

  • 它可以工作,但我想知道我的 XSLT 文件是否正确...如果它可以正常工作,XSLT 应该是正确的。
  • “它可以工作....我想要建议” 你的意思是 你的 XSLT 可以优化吗?
  • @MickyD 是的,我真的是转换 XML 文件的初学者
  • codereview.stackexchange.com上问这类问题可能会更好
  • @Azerty123 这个问题没有回答吗?

标签: c# xml xslt


【解决方案1】:

您的 XSLT 很好。我认为为了帮助人们学习 XSLT 来回答这个问题的最佳方法是检查您的标签并解释它们为什么正常工作。首先,您需要添加 XSL 样式表和命名空间,就像您在此处所做的那样:

&lt;xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt; &lt;xsl:template match ='/'&gt; 是样板文件。如果你没有它,输出将是不正确的。

&lt;xsl:for-each select="Cars/Car"&gt; 调用与 select = 指定的标记匹配的 XML DOM 的每个元素。

接下来,您使用所有文字标签直接更改输出文件中的标签名称。一个标签是字面意义上的,XSLT 只会将它放到您的输出中。 &lt;xsl:value-of select = someString&gt; 标签将标签的值写入 someString 指定的原始文件中。如果你想写一个属性,你需要在字符串的第一个位置有一个@符号。无论您开始使用什么数据,您的输出文件都将包含正确的结果。如果您有疑问,因为正如您所说,您只是在学习 XSLT,获得 XMLSpy 的试用版是验证您的 XSLT 文件以验证它们是否按照您希望的方式执行的好方法。

【讨论】:

  • 感谢您的回答。使用&lt;xsl:element name=""&gt; 定义我的未来节点的所有名称会更好吗?
  • @Azerty123 在需要计算名称时使用xsl:element。否则使用文字结果元素。
【解决方案2】:

我没有 XML 标头。

XML 声明是可选的。大多数 XSLT 处理器都会包含它,除非您明确省略它。如果您的处理器没有,请尝试添加:

<xsl:output omit-xml-declaration="no"/>

到您的样式表的顶层。


我想知道我的 XSLT 文件是否正确

您的样式表没有任何问题。

但是,如果您真的只是在元素名称前加上“车辆”,您可以一次完成所有操作:

<xsl:template match="/Cars">
    <vehicles>
        <xsl:for-each select="Car">
            <vehicle>
                <xsl:for-each select="*">
                    <xsl:element name="vehicle{name()}">
                        <xsl:value-of select="."/>
                    </xsl:element>
                </xsl:for-each>
            </vehicle>
        </xsl:for-each>
    </vehicles>
</xsl:template>

【讨论】:

    猜你喜欢
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 2019-04-11
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多