我想使用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”
的数据
标记?
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>
有一些空闲时间,我想出了以下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>
希望这有帮助,
如何才能将那些键属性设置为“标签”的数据标签展平?
怎么样:
<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: 我的文件: 但是我的输出文件中没有根节点。如何做到这一点? 还有,这是一个好的方法来进行转换吗?堆叠几个模板?