我有一个xml文档,我试图用xsl设置样式。问题取决于我需要从某个节点提取的值,但在xsl中我不知道如何区分以下两个节点:
XML:
<a number=1>
<car>1</car>
</a>
<a number=2>
<dog>1</dog>
</a>
<I_want_to_display>
<number>2</number>
</I_want_to_display>
XSL:
<xsl:for-eachselect="I_want_to_display">
<xsl:if test="number==2">
....display everything in <a number=2>
</xsl:if>
答案 0 :(得分:1)
不知道你正在寻找什么输出,但这是一个猜测。
这个格式良好的XML输入:
<xml>
<a number="1">
<car>1</car>
</a>
<a number="2">
<dog>1</dog>
</a>
<I_want_to_display>
<number>2</number>
</I_want_to_display>
</xml>
使用此样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:apply-templates select="node()|@*"/>
</xsl:template>
<xsl:template match="I_want_to_display">
<xsl:variable name="vNbr" select="number/text()"/>
<xsl:copy-of select="//*[normalize-space(@number) = $vNbr]"/>
</xsl:template>
</xsl:stylesheet>
生成此输出:
<a number="2">
<dog>1</dog>
</a>
答案 1 :(得分:1)
使用此XPath单行:
/*/*[@number = /*/I_want_to_display/number]
完整的XSLT代码(9行):
<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="/">
<xsl:copy-of select="/*/*[@number = /*/I_want_to_display/number]"/>
</xsl:template>
</xsl:stylesheet>
将此转换应用于以下XML文档(因为未提供格式良好的XML文档!):
<t>
<a number="1">
<car>1</car>
</a>
<a number="2">
<dog>1</dog>
</a>
<I_want_to_display>
<number>2</number>
</I_want_to_display>
</t>
产生了想要的正确结果:
<a number="2">
<dog>1</dog>
</a>
解释:XPath运算符=
在每个节点对上应用于两个节点集true()
(一个来自第一个节点集,另一个来自第一个节点集)第二个节点集),具有相同的字符串值。
答案 2 :(得分:0)
<xsl:for-each select="I_want_to_display">
<xsl:copy-of select="preceding-sibling::a[@number = current()/number]/node()>
</xsl:for-each>
答案 3 :(得分:0)
您可以使用密钥收集a
个节点:
<xsl:key name="ka" match="a" use="@number"/>
并使用密钥稍后引用它们以及所需的模板,例如:
<xsl:for-each select="I_want_to_display">
<xsl:copy-of select="key('ka',normalize-space(number))"/>
</xsl:for-each>