Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用可重用的生成ID将XSLT转换为.csv_Xslt - Fatal编程技术网

使用可重用的生成ID将XSLT转换为.csv

使用可重用的生成ID将XSLT转换为.csv,xslt,Xslt,XSLT新手,我一直在尝试,但我想知道这是否可行 我想将一些XML转换为.csv 问题的关键在于,我想为每个选定的元素创建一个数字id,然后对所述元素重新使用该id进行链接 给定以下XML: <root> <executables> <executable name="foo"> <executables> <executable name="bar"></executable>

XSLT新手,我一直在尝试,但我想知道这是否可行

我想将一些XML转换为.csv

问题的关键在于,我想为每个选定的元素创建一个数字id,然后对所述元素重新使用该id进行链接

给定以下XML:

<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&#xd;&#xa;</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>,,&#xd;&#xa;</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>&#xd;&#xa;</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&#xd;&#xa;</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>,,&#xd;&#xa;</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>&#xd;&#xa;</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&#xd;&#xa;</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>,,&#xd;&#xa;</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>&#xd;&#xa;</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或更高版本。对于早期版本,您当然可以,例如,
,然后输出