gpt4 book ai didi

xml - xslt模板优化

转载 作者:数据小太阳 更新时间:2023-10-29 02:59:56 26 4
gpt4 key购买 nike

我有以下 xslt 代码:

<xsl:template match="table_terms_and_abbr">
<informaltable frame='none' colsep='none' rowsep='none'>
<tgroup cols='2' align='left'>
<colspec colnum="1" colwidth='1*'/>
<colspec colnum="2" colwidth='1*'/>
<xsl:apply-templates/>
</tgroup>
</informaltable>
</xsl:template>

以及它正在处理的以下 xml:

<table_terms_and_abbr>
<tblrow_hdr>Name ,, Description</tblrow_hdr>
<tbody>
<tblrow_bold_first> BOT ,, &j_bot;</tblrow_bold_first>
...
</tbody>
</table_terms_and_abbr>

现在我想通过在 table_terms_and_abbr 中移动以下行来改进 xslt:

<tblrow_hdr>Name ,, Description</tblrow_hdr>
<tbody>

</tbody>

所以我会有类似的东西:

<xsl:template match="table_terms_and_abbr">
<informaltable frame='none' colsep='none' rowsep='none'>
<tgroup cols='2' align='left'>
<colspec colnum="1" colwidth='1*'/>
<colspec colnum="2" colwidth='1*'/>
<xsl:call-template name="tblrow_hdr">
BOT ,, &j_bot; * ???? *
</xsl:call-template>
<tbody>
<xsl:apply-templates/>
</tbody>
</tgroup>
</informaltable>
</xsl:template>

标有 * 的行 ????? * 不起作用。我在 linux 平台上使用 saxon9(xslt 2.0 样式表)并得到这个错误:

XTSE0010:xsl:call-template 中不允许有任何字符数据

我知道如何将属性传递给模板,即:

<xsl:with-param name="is_make_first_bold" select = "1" as="xs:integer"/>

但是如何传递自由文本呢?

想法是将所有静态数据移至模板,而在 xml 中仅使用可变数据,即

<table_terms_and_abbr>
<tblrow_bold_first> BOT ,, &j_bot;</tblrow_bold_first>
...
</table_terms_and_abbr>

更多信息
我的要求是创建一个简化的语法来为我们的 DocBook 文档定义可重复的表。为此,我创建了一个通用命名模板 tblrow,它将以“,,”分隔的行拆分为分隔实体,并在表行中创建条目列表。
每个条目可以是一个简单的字符串、一个实体或另一个模板。由于参数编号未定义(表格可以有不同数量的单元格),我不能为模板使用标准参数并使用分隔字符串。如果我想让其中一个表条目包含指向文档中某个位置的链接,我将无法再次使用这些参数,因为我无法将外部参照模板作为参数传递。
不更改 tblrow 模板的主要原因是它可以正常工作 :) 并且有点复杂。我花了很长时间才实现这一点,但我并不完全理解它是如何工作的:)。

除此之外,我还有一些变量可以控制显示的输出,例如 tblrow_hdr,它会为每个条目中的文本加下划线和加粗。由于 tblrow_hdr 对于所有 table_terms_and_abbr 表都是通用的,所以对我来说这听起来很合乎逻辑,而不是在 xml 中调用 tblrow_hdrtable_terms_and_abbr 模板,我就卡在这里了。

最佳答案

I know how to pass the attributes to the template i.e:

<xsl:with-param name="is_make_first_bold" select = "1" as="xs:integer"/>

but how to pass free text ?

将文本作为 xsl:with-param 元素的内容传递。

XSL Transformations 11.6 Passing Parameters to Templates

<xsl:with-param
name = qname
select = expression>
<!-- Content: template -->
</xsl:with-param>

使用 xsl:with-param 元素将参数传递给模板。必需的 name 属性指定参数的名称(要替换其绑定(bind)值的变量)。 name 属性的值为 QName ,如 [2.4 Qualified Names] 中所述进行扩展. xsl:call-templatexsl:apply-templates 中都允许使用 'xsl:with-param'。参数值的指定方式与 xsl:variablexsl:param 相同。用于计算 xsl:with-param 元素指定值的当前节点和当前节点列表与用于 xsl:apply-templatesxsl:call-template 出现的元素。将参数 x 传递给没有用于 xxsl:param 元素的模板不是错误;该参数将被忽略。

此示例为带有控制数字格式的参数的编号 block 定义命名模板。

<xsl:template name="numbered-block">
<xsl:param name="format">1. </xsl:param>
<fo:block>
<xsl:number format="{$format}"/>
<xsl:apply-templates/>
</fo:block>

<xsl:template match="ol//ol/li">
<xsl:call-template name="numbered-block">
<xsl:with-param name="format">a. </xsl:with-param>
</xsl:call-template>
</xsl:template>

关于xml - xslt模板优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/299106/

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