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
Xml 如何使用“<;xsl:apply template>;`使用XSLT?_Xml_Xslt_Xpath_Code Generation - Fatal编程技术网

Xml 如何使用“<;xsl:apply template>;`使用XSLT?

Xml 如何使用“<;xsl:apply template>;`使用XSLT?,xml,xslt,xpath,code-generation,Xml,Xslt,Xpath,Code Generation,我正在进行java代码生成,XSLT中有许多或是不可维护的 字段顺序对消息很重要,我发现生成不同字段的唯一方法是在不同的属性上使用switch case 这是一个示例XML数据: 批量消息 对应的XSL太长,但例如在每个字段上我都使用,因为编码和解码消息缓冲区的顺序很重要。我需要多次使用每个字段 [...] [...] @凌驾 公共字节[]toByteArray(){ ByteBuffer缓冲区=ByteBuffer.allocate(长度); 超级字节数组(缓冲区); 返回buffer.

我正在进行java代码生成,XSLT中有许多
是不可维护的

字段顺序对消息很重要,我发现生成不同字段的唯一方法是在不同的属性上使用switch case

这是一个示例XML数据:


批量消息
对应的XSL太长,但例如在每个字段上我都使用
,因为编码和解码消息缓冲区的顺序很重要。我需要多次使用每个字段


[...]
[...]
@凌驾
公共字节[]toByteArray(){
ByteBuffer缓冲区=ByteBuffer.allocate(长度);
超级字节数组(缓冲区);
返回buffer.array();
}
私有整数=;
私人[]
=新的
[];
私有的
我想为每个字段使用不同的元素(字段数组、字段保留、字段…),但不遵守顺序

  • 这是使用XSL的有效方法吗
  • 关于如何使用XSLT生成代码,您有什么建议吗

注意:我现在仍然可以更改XML的格式。

创建更专门的模板。将模板中的条件语句中的条件上移到模板的匹配条件中

注意:多个模板可能与一个元素匹配。如果它们在匹配标准中具有相同的特异性水平,那么它们将获得相同的计算优先级。您可能必须在模板上指定
@priority
,以便“打破僵局”并控制应该触发哪一个。在本例中,我将
priority=“1”
添加到
字段[array]
的模板中,以确保它与字段[not(@reserved)]的模板匹配

例如:

<!--
*****************************************************************
** Generate a private field declaration 
    for fields that have array elements.
**************************************************************-->
<xsl:template match="field[array]" priority="1" mode="generateField">

private int <xsl:value-of select="array/@sizeName"/><xsl:text> = </xsl:text><xsl:value-of select="array/@size"/>;
private <xsl:value-of select="@type"/><xsl:text>[] </xsl:text><xsl:value-of select="@name"/>
            <xsl:text> = new </xsl:text><xsl:value-of select="@type"/>
            <xsl:text>[</xsl:text><xsl:value-of select="array/@sizeName"/><xsl:text>];</xsl:text>

</xsl:template>

<!--
*****************************************************************
** Generate a private field declaration
    for fields that do not have the attribute reserved.
**************************************************************-->
<xsl:template match="field[not(@reserved)]" mode="generateField">

private <xsl:value-of select="@type"/><xsl:text> </xsl:text><xsl:value-of select="@name"/>;

</xsl:template>

私有整数=;
私人[]
=新的
[];
私有的

它还可以提高性能,因为匹配条件有机会通过XSLT处理器进行优化。

我已经尝试过这一点,但它只考虑没有保留属性的字段……如果您想要一个处理具有保留属性的字段的模板,然后在上面创建一个模板匹配:
我的意思是模板匹配
字段[array]
与任何内容都不匹配。啊,现在我明白了。问题是,多个模板可能与这些标准相匹配(即,一个
字段
,它没有
@保留
,并且具有
数组
子元素)。它们具有相同的特异性水平,因此它们具有相同的优先级,最后一个“获胜”。通过指定
@优先级
,您可以打破僵局。我会更新我的答案。