Xslt 使用xsl参数(如果存在)来复制属性值
我想要一个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"/>
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处理器的文档并在其中找到一个示例。