如何使用 xslt 转换 xml?

Posted

技术标签:

【中文标题】如何使用 xslt 转换 xml?【英文标题】:How to convert xml using xslt? 【发布时间】:2021-12-22 23:41:45 【问题描述】:

输入 XML 文件:

<a>
  <Item key="1">
    <c1>
      <d11>
      </d11>
      <d12 value="1" />
      <d13 />
    </c1>
  </Item>

  <b2>
    <Item key="fix">
      <d21>
      </d21>
      <d22 value="yes" />
      <d23 />
    </Item>
  </b2>

  <b3>
    <c3>
      <d31>
      </d31>
      <Item key="price">
        <e2 value="no" />
        <e3 />
      </Item>
    </c3>
  </b3>
</a>

如何编写 .xsl 样式表以使输出如下所示:

a/Item [@key='1']/c1/d12/@value
a/b2/Item [@key='fix']/d22/@value
a/b3/с2/Item[@key='price']/e2/@value

也就是说,带有@value 属性的标签的完整路径可以包含带有key 属性的特殊值的Item 标签。

【问题讨论】:

您的输入没有value 属性。在这里查看如何生成节点的路径:***.com/a/65293329/3016153 抱歉,修复了输入xml文件中的value属性 好。现在您有了一个示例,因此如果您在尝试后遇到困难,我们可以修复它,而不必从头开始为您编写代码。 不明白如何在具有@value 属性的节点处停止 xsltfiddle.liberty-development.net/jxWVfBU/3 【参考方案1】:

来点简单的怎么样:

XSLT 1.0

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

<xsl:template match="/">
    <xsl:for-each select="//@value">
        <xsl:for-each select="ancestor::*">
            <xsl:value-of select="name()"/>
            <xsl:if test="@key">
                <xsl:text>[@key="</xsl:text>
                <xsl:value-of select="@key"/>
                <xsl:text>"]</xsl:text>
            </xsl:if>
            <xsl:text>/</xsl:text>
        </xsl:for-each>
        <xsl:text>@value&#10;</xsl:text>
    </xsl:for-each>
</xsl:template> 

</xsl:stylesheet>

【讨论】:

以上是关于如何使用 xslt 转换 xml?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XSLT 将单个子 xml 元素转换为 Json 数组

如何使用 xslt 转换 xml?

XSLT:如何使用 XSLT 1.0 和 XALAN 处理器转换部分转义的 XML?

XSLT:如何使用 Muenchian 分组将 XML 转换为文本文件

如何使用 xslt 将嵌套的 Json 对象转换为 xml

如何使用 XSLT saxonica 将 xml 转换为点? [复制]