使用可重用的生成ID将XSLT转换为.csv
XSLT新手,我一直在尝试,但我想知道这是否可行 我想将一些XML转换为.csv 问题的关键在于,我想为每个选定的元素创建一个数字id,然后对所述元素重新使用该id进行链接 给定以下XML:使用可重用的生成ID将XSLT转换为.csv,xslt,Xslt,XSLT新手,我一直在尝试,但我想知道这是否可行 我想将一些XML转换为.csv 问题的关键在于,我想为每个选定的元素创建一个数字id,然后对所述元素重新使用该id进行链接 给定以下XML: <root> <executables> <executable name="foo"> <executables> <executable name="bar"></executable>
<root>
<executables>
<executable name="foo">
<executables>
<executable name="bar"></executable>
</executables>
</executable>
</executables>
<constraints>
<constraint name="baz" from="foo" to="bar"></constraint>
</constraints>
</root>
这可能吗
以下是我的起始XSL:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8" indent="no"/>
<xsl:template match="text()" />
<xsl:template match="/">
<xsl:text>id,type,name,from,to
</xsl:text>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="executables">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="constraints">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="executable">
<xsl:number format="1" level="any"/>,executable,<xsl:value-of select="@name" /><xsl:text>,,
</xsl:text>
<xsl:apply-templates />
</xsl:template>
<xsl:template match="constraint">
<xsl:number format="1" level="any"/>,constraint,<xsl:value-of select="@name" />,<xsl:value-of select="@from" />,<xsl:value-of select="@to" /><xsl:text>
</xsl:text>
<xsl:apply-templates />
</xsl:template>
</xsl:stylesheet>
所以我基本上需要使用由@name属性匹配的
,这将是唯一的。而且这个数字也不太正确;对于约束匹配,它再次从1开始计数。对于这两个
我想您需要
对于参考设置键
,然后使用例如
和设置来代替
<xsl:template match="executable" mode="number">
<xsl:number level="any"/>
</xsl:template>
如果还可以引用约束
元素,则在密钥声明中使用match=“executable | constraint”
,并在该模板中使用
对于
,您使用
对于这两个
我想你想要
对于参考设置键
,然后使用例如
和设置来代替
<xsl:template match="executable" mode="number">
<xsl:number level="any"/>
</xsl:template>
如果还可以引用约束
元素,则在密钥声明中使用match=“executable | constraint”
,并在该模板中使用
对于
,您使用
我将使用实际生成的ID,如标题中所述,而不是尝试生成顺序编号: XSLT1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8" indent="no"/>
<xsl:strip-space elements="*"/>
<xsl:key name="exe-by-name" match="executable" use="@name" />
<xsl:template match="/root">
<xsl:text>id,type,name,from,to
</xsl:text>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="executable">
<xsl:value-of select="generate-id()" />
<xsl:text>,executable,</xsl:text>
<xsl:value-of select="@name" />
<xsl:text>,,
</xsl:text>
<xsl:apply-templates />
</xsl:template>
<xsl:template match="constraint">
<xsl:value-of select="generate-id()" />
<xsl:text>,constraint,</xsl:text>
<xsl:value-of select="@name" />
<xsl:text>,</xsl:text>
<xsl:value-of select="generate-id(key('exe-by-name', @from))" />
<xsl:text>,</xsl:text>
<xsl:value-of select="generate-id(key('exe-by-name', @to))" />
<xsl:text>
</xsl:text>
<xsl:apply-templates />
</xsl:template>
</xsl:stylesheet>
id、类型、名称、发件人、收件人和xd
;
,可执行,
、、
;
,约束,
,
,
;
演示(使用正确的XML):我将使用实际生成的ID,如标题中所述,而不是尝试生成顺序编号: XSLT1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8" indent="no"/>
<xsl:strip-space elements="*"/>
<xsl:key name="exe-by-name" match="executable" use="@name" />
<xsl:template match="/root">
<xsl:text>id,type,name,from,to
</xsl:text>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="executable">
<xsl:value-of select="generate-id()" />
<xsl:text>,executable,</xsl:text>
<xsl:value-of select="@name" />
<xsl:text>,,
</xsl:text>
<xsl:apply-templates />
</xsl:template>
<xsl:template match="constraint">
<xsl:value-of select="generate-id()" />
<xsl:text>,constraint,</xsl:text>
<xsl:value-of select="@name" />
<xsl:text>,</xsl:text>
<xsl:value-of select="generate-id(key('exe-by-name', @from))" />
<xsl:text>,</xsl:text>
<xsl:value-of select="generate-id(key('exe-by-name', @to))" />
<xsl:text>
</xsl:text>
<xsl:apply-templates />
</xsl:template>
</xsl:stylesheet>
id、类型、名称、发件人、收件人和xd
;
,可执行,
、、
;
,约束,
,
,
;
演示(使用正确的XML):
标记中不能有逗号。而且baz
与bar
不匹配
标记中不能有逗号。另外,baz
与bar
不匹配。谢谢,这个答案也可以,但我只需要一个任意数字,因为这是这个.csv的消费者所期望的。谢谢,这个答案也可以,但我只需要一个任意数字,因为这是这个.csv的消费者所期望的,所以有可能将数字偏移1吗?我似乎找不到一个办法来做那件事。我需要这样做,因为csv在headerIn XSLT 3之后会有一个人工行(可能也是2行,我现在不记得了),所以可以使用从开始,例如
,如中所述,但您需要一个XSLT 3处理器,如Saxon 9.8或更高版本。对于早期版本,您当然可以,例如,
,然后输出
。是否可以将数字偏移1?我似乎找不到一个办法来做那件事。我需要这样做,因为csv在headerIn XSLT 3之后会有一个人工行(可能也是2行,我现在不记得了),所以可以使用从开始,例如
,如中所述,但您需要一个XSLT 3处理器,如Saxon 9.8或更高版本。对于早期版本,您当然可以,例如,
,然后输出
。