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
Xslt 有没有一种简单的方法来指定属性名列表,以及如何以类似的方式转换它们?_Xslt - Fatal编程技术网

Xslt 有没有一种简单的方法来指定属性名列表,以及如何以类似的方式转换它们?

Xslt 有没有一种简单的方法来指定属性名列表,以及如何以类似的方式转换它们?,xslt,Xslt,以下XSLT定义了XML到CSV格式的转换: “a”、“b”、“c”、“d”、“e”、“f”、“g” "", "", "", "", "", "", "" 为每个属性手动编写值提取是很烦人的,并且会随着属性数量的增加而增加代码大小。有没有办法缩短它,这样我就可以在一个地方指定字段列表及其顺序(“a”、“b”、“c”、“d”、“e”、“f”、“g”),然后指定某种较短的模式,以指定属性将被提取并按原样格式化?如果这使事情变得更简单,可以对最后一个属性@g进行例外并手动执行此操作,

以下XSLT定义了XML到CSV格式的转换:


“a”、“b”、“c”、“d”、“e”、“f”、“g”


"",
"",
"",
"",
"",
"",
""


为每个属性手动编写值提取是很烦人的,并且会随着属性数量的增加而增加代码大小。有没有办法缩短它,这样我就可以在一个地方指定字段列表及其顺序(“a”、“b”、“c”、“d”、“e”、“f”、“g”),然后指定某种较短的模式,以指定属性将被提取并按原样格式化?如果这使事情变得更简单,可以对最后一个属性
@g
进行例外并手动执行此操作,因为它的不同之处在于它后面不需要逗号。

使用XSLT 2.0或更高版本,您可以使用

<xsl:text>"</xsl:text>
<xsl:value-of select="@a, @b, @c, @d, @e, @f, @g" separator="&quot;,&quot;"/>
<xsl:text>"</xsl:text>
我会:

<xsl:template match="@*" mode="m">
  <xsl:text>"</xsl:text><xsl:value-of select="."/><xsl:text>",</xsl:text>
</xsl:template>

"",
然后(在XSLT2.0中)




或者在XSLT1.0中(尽管我不能再设想在任何情况下使用XSLT1.0…)




....

是否仅限于XSLT 1.0?如果是,属性名称是否真的
a
b
c
等,以便您可以处理
@*
并按名称排序?我更喜欢这两个版本的答案。属性需要精确匹配,因为XML中可能有其他内容,或者它们的顺序可能与输出CSV所需的顺序不同。XSLT/XPath数据模型中的属性没有顺序,因此您需要告诉我们使用的示例顺序(字母顺序)可用于按字母顺序处理
@*
。了解属性是否丢失也很重要。@MartinHonnen假设不能以编程方式派生顺序,则需要指定该顺序。
<xsl:template match="@*" mode="m">
  <xsl:text>"</xsl:text><xsl:value-of select="."/><xsl:text>",</xsl:text>
</xsl:template>
<xsl:for-each select="myTag">
   <xsl:text>&#10;</xsl:text>
   <xsl:apply-templates select="@a,@b,@c,@d,@e,@f,@g" mode="m"/>
</xsl:for-each>
<xsl:for-each select="myTag">
   <xsl:text>&#10;</xsl:text>
   <xsl:apply-templates select="@a" mode="m"/>
   <xsl:apply-templates select="@b" mode="m"/>
   ....
</xsl:for-each>