1

我试图在谷歌上寻找答案,但我得到的结果是如何替换字符串或替换子字符串等。但我的问题略有不同。

假设我有一个现有的 XSL 模板,比如“ hello-world ”,它处理“data/records/record”,但我无法修改hello-world,所以我正在考虑创建一个包装模板来按摩/修改数据在将每条记录传递给hello-world之前在每条记录中......有没有办法做到这一点?

到目前为止,我已经设法创建了一个可以过滤掉重复记录的函数,并且我正在考虑用新记录替换“data/records/*”中的所有记录......

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">


    <xsl:template match="/">
        <xsl:call-template name="get-unique-record">
            <xsl:with-param name="records" select="/data/records/record"/>
        </xsl:call-template>
    </xsl:template>

    <!-- This function will filter out the given records and return a unique set of records -->
    <xsl:key name="kField_ID" match="field[@name='ID']" use="."/>
    <xsl:template name="get-unique-record">
        <xsl:param name="records"/>
        <xsl:for-each select="$records">
            <xsl:variable name="record" select="."/>
            <xsl:if test="$record//field[generate-id() = generate-id(key('kField_ID', .))]">
            <xsl:copy-of select="$record"/>         
            </xsl:if>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

现在...是否可以执行以下操作:

<xsl:variable name="/data/records/record">
    <xsl:call-template name="get-unique-record">
        <xsl:with-param name="records" select="/data/records/record"/>
    </xsl:call-template>
</xsl:variable>

编辑:@LasrH,感谢您的快速回复。有没有办法复制现有的“/”,然后用过滤的 /data/records/record 替换所有的 /data/records/record?

EDIT2:@LasrH,我创建了几个模板来修改和重建“数据”节点。是否可以使用节点集将现有输入“替换”为我的新数据作为输入?

<xsl:variable name="data">
    <xsl:call-template name="rebuild-data-with-record">
        <xsl:with-param name="records">
                    <xsl:copy-of select="$unique-records"></xsl:copy-of>
                    </xsl:with-param>
    </xsl:call-template>
</xsl:variable>

然后再往下,我尝试像这样使用节点集:

<xsl:apply-templates select="exslt:node-set($data)/data"/>

但它看起来不像正在这样做......也没有抛出错误。

4

2 回答 2

1

实际上,经过大量研究和试验,您可以在 XSL 级别“替换/替换”数据!!!您只需要自己重建根节点,并将您的“修改后的根”(RTF 将其转换回节点集)传递给您的模板,并让您的模板从您自己的数据中读取它!!!

我在这里问了另一个问题,这是我实验的一部分,以使其工作: 无法从 XRTreeFrag 转换为 XNodeSet

这个想法是这样的,你有一个模板函数来读取/处理传入的数据,我们几乎总是从根 /blah/blah/blah 读取输入......而不是从根读取它,你可以做这在您的每个/任何模板中:

<xsl:template name="helloworld">
    <xsl:param name="inputRoot" select="/"/>
    <xsl:variable name="root" select="$inputRoot"/>
    rest of your code goes here...

现在,用 $root/blah/blah/blah 替换您的所有 root 访问权限,它将接收您修改后的 XSL 数据!

很酷的一点是,如果你不传递任何输入数据,它只会假设输入是根!;)

这是经过测试并且可以完美运行的。然而,我只有一个担心,如果 XSL 输入很大,重建整个根可能会导致性能问题。但我的输入只有两打记录,我的案例对性能的影响为零。

因此,您可能需要仔细检查您的输入数据是否很大。

此解决方案/方法对 XSL 1.0 友好。

于 2012-08-03T14:33:07.233 回答
1

不,在 XSL 中,您不能就地修改源文档。

但是,您可以在上游处理源文档(使用单独的 XSL 样式表),并将处理后的文档传递给调用“hello-world”模板的 XSL 样式表,而不是让它处理原始源文档。

如果您能够修改该样式表,您甚至可以在包含“hello-world”的同一个样式表中执行此操作。(但我猜你不能修改那个样式表,或者你可以修改“hello-world”。)

于 2012-07-17T21:00:53.893 回答