我甚至不知道这是否可能,我也知道有一种更简单的方法可以做到这一点,但我需要使用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>