我有一个XML文件:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<File>
<Customer>
<LastName>MyLastName</LastName>
</Customer>
<Cars>
<Car>
<Color>Blue</Color>
<Model>Car2</Model>
<Year>1988</Year>
<Speed>250</Speed>
</Car>
<Car>
<Color>Green</Color>
<Model>Car3</Model>
<Year>1989</Year>
<Speed>350</Speed>
</Car>
</Cars>
</File>
我想使用XSLT将其转换为have:
<?xml version="1.0" encoding="utf-8"?>
<File>
<Purchaser>
<Name>MyLastName</Name>
</Purchaser>
<vehicles>
<vehicle>
<vehicleColor>Blue</vehicleColor>
<vehicleModel>Car2</vehicleModel>
<vehicleYear>1988</vehicleYear>
<vehicleSpeed>250</vehicleSpeed>
</vehicle>
<vehicle>
<vehicleColor>Green</vehicleColor>
<vehicleModel>Car3</vehicleModel>
<vehicleYear>1989</vehicleYear>
<vehicleSpeed>350</vehicleSpeed>
</vehicle>
</vehicles>
</File>
我的XSLT
文件:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"
indent="yes"
encoding="utf-8"
media-type="text/xml"/>
<xsl:template match="File/Customer">
<xsl:element name="Purchaser">
<xsl:element name="Name">
<xsl:value-of select="LastName"/>
</xsl:element>
</xsl:element>
</xsl:template>
<xsl:template match="File/Cars">
<xsl:element name="vehicles">
<xsl:for-each select="Car">
<xsl:element name="vehicle">
<xsl:element name="vehicleColor">
<xsl:value-of select="Color"/>
</xsl:element>
<xsl:element name="vehicleModel">
<xsl:value-of select="Model"/>
</xsl:element>
<xsl:element name="vehicleYear">
<xsl:value-of select="Year"/>
</xsl:element>
<xsl:element name="vehicleSpeed">
<xsl:value-of select="Speed"/>
</xsl:element>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
但是我的输出文件中没有根节点。如何做到这一点?
还有,这是一个好的方法来进行转换吗?堆叠几个模板?
这是进行转换的好方法吗?堆叠了几个模板?
您可以使用多个模板,也可以使用一个模板——在这种情况下,两种方法都没有明显的优点或缺点。就我个人而言,我会保持简短,坚持使用一个模板(主要是因为只有一个节点需要复制而不需要修改):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/File">
<File>
<Purchaser>
<Name>
<xsl:value-of select="Customer/LastName"/>
</Name>
</Purchaser>
<vehicles>
<xsl:for-each select="Cars/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>
</File>
</xsl:template>
</xsl:stylesheet>
我建议从身份转换模板开始
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
它复制了您不想转换的节点,如文件元素,然后允许您添加执行转换的模板,如
<xsl:template match="Customer">
<Purchaser>
<xsl:apply-templates/>
</Purchaser>
</xsl:template>
<xsl:template match="LastName">
<Name>
<xsl:apply-templates/>
</Name>
</xsl:template>
<xsl:template match="Cars">
<vehicles>
<xsl:apply-templates/>
</vehicles>
</xsl:template>
<xsl:template match="Car">
<vehicle>
<xsl:apply-templates/>
</vehicle>
</xsl:template>
<xsl:template match="Car/*">
<xsl:element name="vehicle{local-name()}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
等等如您所见,我只是在大多数地方使用了文字结果元素,而不是更详细的xsl:element,因为只有在运行时需要计算名称和/或命名空间时才需要它。
我是XSLT新手。我想根据其他子节点的条件更改XML中的根节点。但子节点始终保持不变。例如,我有以下XML: 我喜欢将XML更改为: 这意味着依赖于<代码> 我不想在每个<代码>
您能帮助如何用子节点分割成半节点吗? 输入: 输出: 不幸的是,我对xslt没有经验,也没有找到这样的例子。 更新后,我尝试了下面建议的方法之一,并有这个https://xsltfiddle.liberty-development.net/jyH9rNq/3节点不复制 xslt: 输出:
XML输入文件: XML输入文件转换为XML输出文件。将XML输入文件的firstName、middleName和lastName标签合并为XML Ouput文件的name标签,将XML输入文件的address1、address2、city、state和pincode标签合并为XML Ouput文件的address标签。 我几乎转换了代码,但我在这里与empId作斗争。我已经在XSLT文件中手动输
问题内容: 我想使用xsl文件转换一些xml并以某种方式输出结果(我使用的是Android Api Level 8)。 我当前的活动看起来像这样,但是转换器保持为空。LogCat引发一个with ,表示xml格式不正确,但是我确定它是正确的。 我在LogCat中发现了一条提示,提示在上述错误消息之前。 我究竟做错了什么? 这是要转换的xml文件(source.xml) 这是对应的xsl(produ
我想使用XSLT将一些XML转换为JSON。XML如下所示: 我希望JSON如下所示: 推荐的方法是什么? 我已经有了一个方法,它看起来不太好,因为它只适用于xslt 1.0(我认为)和文本块。请参阅此处:https://xsltfiddle.liberty-development.net/naZYrpy/1 我更喜欢使用xslt 3.0和xml to json函数的更有效方法,但似乎不可能添加额
我想从XML结构中使用单个节点创建嵌套的XML节点,我尝试过但无法带来嵌套的XML结构,请一些人帮助我,我无法获得预期的行为。 XML结构: XSL使用: 收到的输出: 预期产出 “人员非活动”元素应用于匹配