使用xslt将xml转换为csv时,我面临着处理传递依赖的挑战。 下面是我的xml(简化):
<root>
<hold id="H_100">
<value1>A</value1>
</hold>
<hold id="H_200">
<value1>B</value1>
</hold>
<hold id="H_300">
<value1>C</value1>
</hold>
<party id="C_100">
<value2>D</value2>
</party>
<party id="C_200">
<value2>E</value2>
</party>
<party id="C_300">
<value2>F</value2>
</party>
<party id="A_100">
<value2>G</value2>
</party>
<party id="A_300">
<value2>H</value2>
</party>
<relation hid="H100" pid="C_100"/>
<relation hid="H100" pid="A_100"/>
<relation hid="H200" pid="C_200"/>
<relation hid="H300" pid="A_300"/>
</root>
我的预期输出是(只有当pid以A_开头时才应考虑派对):
Hold,Party
A,G
B,
C,H
有没有人知道如何使用xslt ??
来做到这一点答案 0 :(得分:1)
使用XSLT 1.0尝试如下:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="text" encoding="utf-8"/>
<xsl:template match="/">
<xsl:value-of select="concat('Hold', ',', 'Party', '
')"/>
<xsl:for-each select="/root/*[name() = 'hold']">
<xsl:variable name="var.hid" select="translate(@id, '_', '')"/>
<xsl:variable name="var.pid" select="/root/relation[@hid = $var.hid and starts-with(@pid, 'A_')]/@pid"/>
<xsl:value-of select="concat(value1, ',', /root/party[@id = $var.pid]/value2, '
')"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
结果将符合预期:
Hold,Party
A,G
B,
C,H
答案 1 :(得分:0)
要遵循XSLT中的交叉引用,您可以使用密钥,因此使用XSLT 2或3可以使用
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0">
<xsl:output method="text"/>
<xsl:key name="rel" match="relation" use="@hid"/>
<xsl:key name="party" match="party" use="@id"/>
<xsl:template match="/">
<xsl:text>Hold,Party </xsl:text>
<xsl:apply-templates select="root/hold"/>
</xsl:template>
<xsl:template match="hold">
<xsl:value-of select="value1, key('party', key('rel', translate(@id, '_', ''))/@pid[starts-with(., 'A_')])/value2" separator=","/>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
http://xsltfiddle.liberty-development.net/eiQZDbi
对于XSLT 1,您可以使用相同的密钥,但value-of
只输出一个节点,您需要将上面使用的value-of
分成两个,以输出value1
加上引用value2
。
如果在实际数据中hid
值具有下划线,则可以将子表达式key('rel', translate(@id, '_', ''))
简化为key('rel', @id)
,请参阅http://xsltfiddle.liberty-development.net/eiQZDbi/1。上面的示例假定hid
和id
值不同,因此在使用密钥之前尝试删除下划线。