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