作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试进行生成 C 代码的 XSLT 转换,应转换以下 XML:
<enum name="anenum">
<enumValue name="a"/>
<enumValue name="b"/>
<enumValue name="c" data="10"/>
<enumValue name="d" />
<enumValue name="e" />
</enum>
它应该转换为一些 C 代码,如下所示:
enum anenum {
a = 0,
b = 1,
c = 10,
d = 11,
e = 12
}
或者(因为 C 预处理器将处理求和):
enum anenum {
a = 0,
b = 1,
c = 10,
d = c+1,
e = c+2
}
我的 XSLT 的核心是这样的:
<xsl:for-each select="enumValue">
<xsl:value-of select="name"/>
<xsl:text> = </xsl:text>
<xsl:choose>
<xsl:when test="string-length(@data)>0">
<xsl:value-of select="@data"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="position()-1"/>
</xsl:otherwise>
</xsl:choose>
<xsl:text>,
(为简单起见,我跳过了一些“最后一个元素没有逗号”的代码)
此示例不会为 d 和 e
生成正确的值我一直在尝试让它为变量 d 和 e 工作,但到目前为止我没有成功。
使用像这样的结构:
<xsl:when test="string-length(preceding-sibling::enumValue[1]/@datavalue)>0">
<xsl:value-of select="preceding-sibling::enumValue/@data + 1"/>
</xsl:when>
...仅适用于指定值之后的第一个值(在本例中为 d)。
谁能帮帮我?我可能在程序方面想得太多了......
最佳答案
非递归解决方案,使用键:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:output method="text"/>
<xsl:key name="koffsetEnums" match="enumValue[@data]"
use="generate-id()"/>
<xsl:template match="enum">
enum <xsl:value-of select="@name"/> {
<xsl:apply-templates select="enumValue"/>
}
</xsl:template>
<xsl:template match="enumValue">
<xsl:value-of select="concat(@name, ' = ')"/>
<xsl:variable name="voffsetValueId" select=
"generate-id((. | preceding-sibling::enumValue)
[@data][last()]
)"/>
<xsl:choose>
<xsl:when test="not($voffsetValueId)">
<xsl:value-of select="concat(position(),'
 ')"/>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="vinitOffset" select=
"key('koffsetEnums', $voffsetValueId)/@data"
/>
<xsl:value-of select=
"$vinitOffset
+
count(preceding-sibling::enumValue)
-
count(key('koffsetEnums', $voffsetValueId)/preceding-sibling::enumValue)
"
/>
<xsl:text>
 </xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
当上述转换应用于最初提供的 XML 文档时:
<enum name="anenum">
<enumValue name="a"/>
<enumValue name="b"/>
<enumValue name="c" data="10"/>
<enumValue name="d" />
<enumValue name="e" />
</enum>
生成了所需的结果:
enum anenum {
a = 1
b = 2
c = 10
d = 11
e = 12
}
关于c - 如何使用可选值在 XSLT 中模拟 C 枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/535938/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!