我是XSL的新手,并且有这个问题,所以我有这个XML
mdpi/hdpi/xhpi/xxhpdi
所以我想获取值test2,所以这是我的声明,它不起作用:
<a>
<b>
<c1>
<d>N1</d>
<e>Test</e>
</c1>
<c1>
<d>N1</d>
<e>Test2</e>
</c1>
</b>
</a>
答案 0 :(得分:1)
您的源XML包含一些错误。
首先要纠正的是将<e>Test/<e>
更改为<e>Test</e>
(斜线应位于<
之后,以形成结束标记。
然后在您的XSLT中查看<xsl:for-each select="//b/c1[2]">
。
c1[2]
表示您想要具有c1
名称的 second 元素。
因此要更改的第二件事是将<c2> ... </c2>
更改为
<c1> ... </c1>
,因此您将拥有第二个c1
元素。
因此,您的源XML应该如下:
<a>
<b>
<c1>
<d>N1</d>
<e>Test</e>
</c1>
<c1>
<d>N1</d>
<e>Test2</e>
</c1>
</b>
</a>
另一个重要的事情是您无法启动XSLT脚本
只需<xsl:for-each...
。
您必须以<xsl:stylesheet
作为主要标签。
然后,例如在与/
匹配的模板中,应放置
一些主要标签(我将其称为main
,请参见下文),以及
在其中,可以放置您的for-each
循环。
下一个更正与<xsl:if test="d = N1">
有关。
将其更改为<xsl:if test="d = 'N1'">
,因为N1
是一个
字符串常量,而不是标签名称。
因此整个XSLT脚本可以是例如:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:output indent="yes"/>
<xsl:template match="/">
<main>
<xsl:for-each select="//b/c1[2]">
<xsl:if test="d = 'N1'">
<data>
<xsl:value-of select="e"/>
</data>
</xsl:if>
</xsl:for-each>
</main>
</xsl:template>
</xsl:stylesheet>
它给出:
<?xml version="1.0" encoding="UTF-8"?>
<main>
<data>Test2</data>
</main>