Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 使用xsl参数(如果存在)来复制属性值_Xslt - Fatal编程技术网

Xslt 使用xsl参数(如果存在)来复制属性值

Xslt 使用xsl参数(如果存在)来复制属性值,xslt,Xslt,我想要一个xsl,它仅在传递了相关的param名称(它们是从调用java程序传递的)时才替换数据元素的value属性 输入 <applicationVariables applicationServer="tomcat"> <data name="HOST" value="localhost"/> <data name="PORT" value="8080"/> <data name="SIZE" value="1000"/>

我想要一个xsl,它仅在传递了相关的
param
名称(它们是从调用java程序传递的)时才替换数据元素的value属性

输入

<applicationVariables applicationServer="tomcat">
    <data name="HOST" value="localhost"/>
    <data name="PORT" value="8080"/>
    <data name="SIZE" value="1000"/>
</applicationVariables>

因此,例如,如果传入一个param HOST1=myHost和PORT=9080,则输出应为:

<applicationVariables applicationServer="tomcat">
    <data name="HOST" value="myHost"/>
    <data name="PORT" value="9080"/>
    <data name="SIZE" value="1000"/>
</applicationVariables>

请注意,已替换主机和端口,但未替换大小,因为没有名称为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=@name的参数是否存在

您可以将逻辑条件与组合在一起。

在这种情况下,最好将所有参数作为单个
的元素进行传递:

<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>
<applicationVariables applicationServer="tomcat">
    <data name="HOST" value="localhost"/>
    <data name="PORT" value="8080"/>
    <data name="SIZE" value="1000"/>
</applicationVariables>

myHost

9080

在提供的XML文档上应用此转换时:

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


xsl:if不能解决我的问题。我刚刚编辑了我的问题来澄清我的问题。好问题(+1)。有关紧凑的解决方案,请参见我的答案。:)但是如何从java程序传递这个参数呢?我尝试了以下操作,但不起作用@ASAF:这取决于实现,并且在处理器之间有所不同。您必须阅读XSLT处理器的文档并在其中找到一个示例。