我想要一个xsl,只有在传递相关的param
名称时才会替换数据元素的value属性(它们是从调用java程序传递的)。
输入
<applicationVariables applicationServer="tomcat">
<data name="HOST" value="localhost"/>
<data name="PORT" value="8080"/>
<data name="SIZE" value="1000"/>
</applicationVariables>
因此,例如,如果传入一个参数HOST1 = myHost和PORT = 9080,则输出应为:
<applicationVariables applicationServer="tomcat">
<data name="HOST" value="myHost"/>
<data name="PORT" value="9080"/>
<data name="SIZE" value="1000"/>
</applicationVariables>
请注意,HOST和PORT已被替换,但SIZE未被替换,因为没有名称为SIZE的参数
我不想对每个名称进行硬编码检查,如下所示:
<xsl:when test="not($HOST)"> <!-- parameter has not been supplied -->
<xsl:attribute name="value"><xsl:value-of select="@value"/></xsl:attribute>
</xsl:when>
<xsl:otherwise> <!--parameter has been supplied -->
<xsl:attribute name="value"><xsl:value-of select="$HOST"/></xsl:attribute>
</xsl:otherwise>
我想要一种通用的说法:仅当存在具有相同名称的参数时才替换value属性。 但是我如何检查名称= @name的参数是否存在?
答案 0 :(得分:0)
您可以将逻辑条件与xsl:if结合使用。
答案 1 :(得分:0)
在这种情况下,最好将所有参数作为单个<xsl:param>
的元素传递:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="pParams">
<p name="HOST">myHost</p>
<p name="PORT">9080</p>
</xsl:param>
<xsl:variable name="vParams" select=
"document('')/*/xsl:param[@name='pParams']/*"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@value">
<xsl:attribute name="value">
<xsl:value-of select=
"$vParams[@name=current()/../@name]
|
current()[not($vParams[@name=current()/../@name])]
"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<applicationVariables applicationServer="tomcat">
<data name="HOST" value="localhost"/>
<data name="PORT" value="8080"/>
<data name="SIZE" value="1000"/>
</applicationVariables>
产生了想要的正确结果:
<applicationVariables applicationServer="tomcat">
<data name="HOST" value="myHost"></data>
<data name="PORT" value="9080"></data>
<data name="SIZE" value="1000"></data>
</applicationVariables>