当前位置: 首页 > 知识库问答 >
问题:

XSLT转换:根据其属性值平坦嵌套节点

甄云
2023-03-14

我想使用XSLT展平XML文件。示例(可以有任意数量的节点边缘节点):

输入:

<?xml version="1.0" encoding="utf-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns">
  <graph>

    <node id="0">
      <data key="label">A</data>
      <data key="tag1">0</data>
      <data key="tag2">0</data>
    </node>

    <edge id="0" source="0" target="1">
      <data key="label">REFERENCED_TO</data>
    </edge>

  </graph>
</graphml>

期望输出:

<?xml version="1.0" encoding="utf-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns">
  <graph>

    <node id="0" label="A">          
      <data key="tag1">0</data>
      <data key="tag2">0</data>
    </node>

    <edge id="0" source="1" target="0" label="REFERENCED_TO"/>

  </graph>
</graphml>

如何仅展平那些将属性设置为“label”数据标记?

共有3个答案

刘意
2023-03-14

hor257k的解决方案似乎包含@key='tag'的三个测试。这里有一个改进它的尝试:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:gml="http://graphml.graphdrawing.org/xmlns">

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<!-- convert label element to attribute -->
<xsl:template match="gml:data[@key='label']">
  <xsl:attribute name="label">
    <xsl:value-of select="."/>
  </xsl:attribute>
</xsl:template>

</xsl:stylesheet>

为了完整起见,这里是XSLT 3.0版本:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:gml="http://graphml.graphdrawing.org/xmlns">

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:mode on-no-match="shallow-copy"/>

<!-- convert label element to attribute -->
<xsl:template match="gml:data[@key='label']">
  <xsl:attribute name="label" select="."/>
</xsl:template>

</xsl:stylesheet>
文华美
2023-03-14

有一些空闲时间,我想出了以下XSLT(它是基于1.0的,非常冗长)

<?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" 
                xmlns:g="http://graphml.graphdrawing.org/xmlns"
                exclude-result-prefixes="msxsl"
>
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/">
      <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="*[*/@key='label']">
      <xsl:element name="{local-name()}" namespace="{namespace-uri()}">
        <xsl:copy-of select="@*"/>
      <xsl:attribute name="label">
        <xsl:value-of select="*[@key='label']/text()" />
      </xsl:attribute>
      <xsl:apply-templates select="*[not(@key='label')]"/>
      </xsl:element>
    </xsl:template>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

希望这有帮助,

麻鸿熙
2023-03-14

如何才能将那些键属性设置为“标签”的数据标签展平?

怎么样:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:gml="http://graphml.graphdrawing.org/xmlns">

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<!-- add label attribute -->
<xsl:template match="gml:node | gml:edge">
    <xsl:copy>
        <xsl:if test="gml:data[@key='label']">
            <xsl:attribute name="label"><xsl:value-of select="gml:data[@key='label']"/></xsl:attribute>
        </xsl:if>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<!-- suppress label element -->
<xsl:template match="gml:data[@key='label']"/>

</xsl:stylesheet>
 类似资料:
  • 我想从XML结构中使用单个节点创建嵌套的XML节点,我尝试过但无法带来嵌套的XML结构,请一些人帮助我,我无法获得预期的行为。 XML结构: XSL使用: 收到的输出: 预期产出 “人员非活动”元素应用于匹配

  • 我有一个XML: 我想向根元素:/doc添加一个属性(名称空间),以便输出如下所示: 我尝试了三种xslt(跳过了默认的“复制所有”部分以减少问题的长度)。 xslt1:见下文,问题在于将空名称空间xmlns=”“添加到/doc的所有子节点(即:/doc/tag1和/doc/tag2) Xslt2:见下文,问题是“ns”被添加到根节点:和 xslt3:请参见下文,问题是报告了错误:未定义名称空间前

  • 我对这个问题进行了编辑以使其清楚。我想获取所有的节节点,包括它们的节节点和标题节点,保持嵌套级别。下面是我想要的输出结果: xml内容如下: 以下是我的解决方案,这是错误的: 我曾想过使用递归,但我没有发现如何在XSLT中做到这一点。应该还有其他方法。提前感谢!

  • 我正在寻找一种解决方案,使用Jackson基于同一POJO中的其他属性值序列化POJO对象属性 如果某个属性值符合某些条件,则应根据要求更改其他属性值 例如,下面是我的JSON对象: 在上述情况下,如果的值符合某些条件,那么我应该能够更改的值 为什么需要这样做: 是一个配置对象 和-是配置设置 在上面的例子中,中有一个是,我需要屏蔽/更改相应的 还要补充一点,在这个例子中,属性是和,但是如果我们找

  • 我想递归地连接一个节点的参数值和它的父节点的相同参数值。 例如,如下: 应该成为 我试过了 有什么问题吗?

  • 我有一个XML文件: 我想使用XSLT将其转换为have: 我的文件: 但是我的输出文件中没有根节点。如何做到这一点? 还有,这是一个好的方法来进行转换吗?堆叠几个模板?