如何在xslt中使用//通过XPATH使用选择节点

时间:2015-06-12 11:41:55

标签: xml xslt

这是我的输入架构(xml):

<ns0:Catalog xmlns:ns0="http://Schema.InputSchema1">
<cd>
<cd1 ID="1" Title="Employee">
<Name>Prakash</Name>
<Salary>50000</Salary>
</cd1>
<cd1 ID="2" Title="Singer">
<Name>Ellie</Name>
<Salary>500000</Salary>
</cd1>
</cd>
</ns0:Catalog>`

我正在申请以下xslt:

<?xml version="1.0" encoding="utf-16" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:var=
"http://schemas.microsoft.com/BizTalk/2003/var" 
exclude-result-prefixes="msxsl var s0" 
version="1.0" xmlns:ns0="http://Schema.OutputSchema1"   xmlns:s0=
"http://Schema.InputSchema1">
<xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
<xsl:template match="/">
<xsl:apply-templates select="/s0:Catalog" />
</xsl:template>
<xsl:template match="/s0:Catalog">
<ns0:Output>
<xsl:for-each select="cd/cd1">
<ID>
<xsl:value-of select="//@ID"/>
</ID>
</xsl:for-each>
</ns0:Output>
</xsl:template>
</xsl:stylesheet>

但是我每次都获得ID值,而循环完成2次。 //实际使用的是什么?如何通过//获取所有ID值?

2 个答案:

答案 0 :(得分:0)

指示:

<xsl:value-of select="//@ID"/>

选择作为ID根节点后代的所有/属性,并返回其中一个第一个的值(按文档顺序排列)。

在您的示例中,您已经处于cd1的上下文中,因此您需要做的就是:

<xsl:value-of select="@ID"/>

-

另请注意此模板:

<xsl:template match="/">
<xsl:apply-templates select="/s0:Catalog" />
</xsl:template>

是多余的。

答案 1 :(得分:-1)

@Prakash,

你可以在XSL下面使用获取所有ID值。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each select= "Catalog/cd/cd1">
<ID>
    <xsl:value-of select="@ID"/>
</ID>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

输出:

<?xml version="1.0" encoding="UTF-8"?>
<ID>1</ID>
<ID>2</ID>