使用xsl param(如果存在)替换属性值

时间:2010-05-12 10:46:53

标签: xslt

我想要一个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的参数是否存在?

2 个答案:

答案 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>