gpt4 book ai didi

c - 如何使用可选值在 XSLT 中模拟 C 枚举

转载 作者:太空狗 更新时间:2023-10-29 15:00:02 26 4
gpt4 key购买 nike

我正在尝试进行生成 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)&gt;0">
<xsl:value-of select="@data"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="position()-1"/>
</xsl:otherwise>
</xsl:choose>
<xsl:text>,

(为简单起见,我跳过了一些“最后一个元素没有逗号”的代码)

此示例不会为 de

生成正确的值

我一直在尝试让它为变量 de 工作,但到目前为止我没有成功。

使用像这样的结构:

<xsl:when test="string-length(preceding-sibling::enumValue[1]/@datavalue)&gt;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(),'&#xA; ')"/>
</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>&#xA; </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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com