我试图在谷歌上寻找答案,但我得到的结果是如何替换字符串或替换子字符串等。但我的问题略有不同。
假设我有一个现有的 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"/>
但它看起来不像正在这样做......也没有抛出错误。