如何使用 <xsl:param> 和 <xsl:with-param> 将节点复制到带有 XSLT 1.0 的新 XML 中



我甚至不知道这是否可能,我也知道有一种更简单的方法可以做到这一点,但我需要使用xsl:param&xsl:with-param。

我有这个XML作为输入:

<TR>
<COMPANY name="FIRST">
<CODE>k</CODE>
</COMPANY>
<COMPANY name="SECOND">
<CODE>h</CODE>
</COMPANY>
<COMPANY name="third">
<CODE>d</CODE>
</COMPANY>
</TR>

我只需要复制属性名为SECOND的元素,并得到如下输出:

<TR>
<COMPANY name="SECOND">
<CODE>h</CODE>
</COMPANY>
</TR>

我有一个非常简单的XSLT可以做到这一点:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:str="http://exslt.org/strings" 
extension-element-prefixes="str">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="/">
<xsl:apply-templates select="//COMPANY[@name='SECOND']"/>
</xsl:template>
</xsl:stylesheet>

但正如我所说,我必须使用xsl:param&xsl:用param复制节点,我正在尝试这个XSLT,根本不知道这是否正确:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<xsl:param name="key" select="//COMPANY[@name='SECOND']"/>
<xsl:template match="/">
<xsl:apply-template>
<xsl:with-param name="$key"/>
</xsl:call-template>
</xsl:stylesheet>

我不知道这是否就是您的问题所在,但如果您不想将值"SECOND"硬编码到样式表中,并在运行时将其作为参数传递,您可以简单地执行以下操作:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:param name="theName"/>
<xsl:template match="/TR">
<xsl:copy>
<xsl:copy-of select="COMPANY[@name=$theName]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

最新更新