Xml 使用XSL将一个graphML文件转换为另一个graphML?
我有一个由3个节点和2个连接组成的简单graphML文件,我想对它进行转换,以便标记和属性的内部结构以不同的方式组织 原始文件如下所示:Xml 使用XSL将一个graphML文件转换为另一个graphML?,xml,xslt,converter,graphml,Xml,Xslt,Converter,Graphml,我有一个由3个节点和2个连接组成的简单graphML文件,我想对它进行转换,以便标记和属性的内部结构以不同的方式组织 原始文件如下所示: <?xml version="1.0" encoding="utf-8"?><graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="h
<?xml version="1.0" encoding="utf-8"?><graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
<graph edgedefault="undirected">
<node id="0">
<data key="d0">rBSTS</data>
<data key="d1" />
<data key="d2" />
<data key="d3">n1</data>
<data key="d4" />
</node>
<node id="1">
<data key="d1" />
<data key="d4" />
<data key="d0">rCAC</data>
<data key="d2" />
<data key="d3">n2</data>
</node>
<node id="2">
<data key="d1" />
<data key="d4" />
<data key="d0">rCMF</data>
<data key="d2" />
<data key="d3">n3</data>
</node>
<edge source="0" target="1">
<data key="d5">0.252829037184</data>
</edge>
<edge source="1" target="2">
<data key="d5">0.205407183132</data>
</edge>
</graph>
</graphml>
RBST
n1
rCAC
氮气
rCMF
n3
0.252829037184
0.205407183132
我希望获得的文件如下(我手动转换以显示所需结果):
RBST
RBST
1.
rCAC
rCAC
2.
rCMF
rCMF
3.
0.252829037184
0.205407183132
结构的更改不是那么容易(例如,节点ID在原始数据结构中从0开始,而在所需输出中从n1开始):是否可以使用XSL转换进行转换?我对您想要的转换逻辑做了一些假设 此XSLT样式表:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns="http://graphml.graphdrawing.org/xmlns"
xmlns="http://graphml.graphdrawing.org/xmlns"
exclude-result-prefixes="ns #default">
<xsl:output method="xml"
version="1.0"
indent="yes"
omit-xml-declaration="yes"/>
<!-- The identity transform. By itself, copies out the original input. -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ns:node">
<!-- Copy out this element. -->
<xsl:copy>
<!-- Give it a new 'id' attribute that takes the value of the 'data'
element for 'key' of 'd3'. -->
<xsl:attribute name="id">
<xsl:value-of select="ns:data[@key='d3']"/>
</xsl:attribute>
<!-- Output empty 'data' element for 'key' of 'dn_href'. -->
<data key="dn_href"/>
<!-- Do something particular for 'key' of 'd0'. -->
<xsl:apply-templates select="ns:data[@key='d0']"/>
<!-- Don't know where this value comes from! -->
<data key="dn_intensity_value"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ns:edge">
<xsl:copy>
<!-- Add an 'id' attribute. I'll let you work out what it
should be. -->
<xsl:attribute name="id"/>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ns:data[@key='d0']">
<!-- It seems we want two 'data' elements, with different 'key's,
and the text from the element with 'key' of 'd0'. -->
<xsl:copy>
<xsl:attribute name="key">dn_label</xsl:attribute>
<xsl:apply-templates select="text()"/>
</xsl:copy>
<xsl:copy>
<xsl:attribute name="key">dn_free</xsl:attribute>
<xsl:apply-templates select="text()"/>
</xsl:copy>
</xsl:template>
<!-- It seems 'd5' keys get changed to 'de_strength'. -->
<xsl:template match="@key[. = 'd5']">
<xsl:attribute name="key">
<xsl:value-of select="'de_strength'"/>
</xsl:attribute>
</xsl:template>
<!-- Mapping for source attributes. -->
<xsl:template match="ns:edge/@source">
<xsl:attribute name="source">
<xsl:value-of select="//ns:node[@id=current()]/ns:data[@key='d3']"/>
</xsl:attribute>
</xsl:template>
<!-- Mapping for target attributes. -->
<xsl:template match="ns:edge/@target">
<xsl:attribute name="target">
<xsl:value-of select="//ns:node[@id=current()]/ns:data[@key='d3']"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
dn_标签
免费的
应用于示例输入时,生成以下输出:
<graphml xmlns="http://graphml.graphdrawing.org/xmlns"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
<graph edgedefault="undirected">
<node id="n1">
<data key="dn_href"/>
<data key="dn_label">rBSTS</data>
<data key="dn_free">rBSTS</data>
<data key="dn_intensity_value"/>
</node>
<node id="n2">
<data key="dn_href"/>
<data key="dn_label">rCAC</data>
<data key="dn_free">rCAC</data>
<data key="dn_intensity_value"/>
</node>
<node id="n3">
<data key="dn_href"/>
<data key="dn_label">rCMF</data>
<data key="dn_free">rCMF</data>
<data key="dn_intensity_value"/>
</node>
<edge id="" source="n1" target="n2">
<data key="de_strength">0.252829037184</data>
</edge>
<edge id="" source="n2" target="n3">
<data key="de_strength">0.205407183132</data>
</edge>
</graph>
</graphml>
RBST
RBST
rCAC
rCAC
rCMF
rCMF
0.252829037184
0.205407183132
正如您所看到的,它并不完美(额外的名称空间,缺少一些属性值),但希望它能告诉您可以做什么。是的,可以使用XSLT转换它。您尝试过了吗?是否遇到了具体问题?此外,您对
节点/数据
元素(及其键
属性)的转换没有任何意义。你需要解释一下逻辑。谢谢你的回答。我没有尝试使用XSLT,因为我打算用perl/python编写一个脚本来生成所需的输出。然而,我很好奇XSLT的使用是否可以简化转换,但我不知道XSLT。如果有人提供一些适合我的目标的例子,这将是一个很好的学习机会,否则我会写一个脚本。源和最终数据集转换背后没有真正的逻辑:我有两个应用程序做同样的事情,但需要以一种方式格式化graphML,另一种需要不同的方式。抱歉,我无法从您的“之前”和“之后”文件得出您的转换规范。说你想把粉笔变成奶酪不是一个规范。非常感谢!这是非常有帮助的,特别是因为评论。从您的XSLT开始,我能够获得我所需要的东西。
<graphml xmlns="http://graphml.graphdrawing.org/xmlns"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
<graph edgedefault="undirected">
<node id="n1">
<data key="dn_href"/>
<data key="dn_label">rBSTS</data>
<data key="dn_free">rBSTS</data>
<data key="dn_intensity_value"/>
</node>
<node id="n2">
<data key="dn_href"/>
<data key="dn_label">rCAC</data>
<data key="dn_free">rCAC</data>
<data key="dn_intensity_value"/>
</node>
<node id="n3">
<data key="dn_href"/>
<data key="dn_label">rCMF</data>
<data key="dn_free">rCMF</data>
<data key="dn_intensity_value"/>
</node>
<edge id="" source="n1" target="n2">
<data key="de_strength">0.252829037184</data>
</edge>
<edge id="" source="n2" target="n3">
<data key="de_strength">0.205407183132</data>
</edge>
</graph>
</graphml>