Xslt Position函数返回值无法索引集合中的特定节点
我有以下XSLT,可以很好地工作:Xslt Position函数返回值无法索引集合中的特定节点,xslt,xslt-1.0,Xslt,Xslt 1.0,我有以下XSLT,可以很好地工作: <xsl:template match="/*"> <root> <xsl:variable name="AddressNames" select="myUtil:getSecondXMLData()"/> <xsl:for-each select="item"> <AddressName> <xsl:variable na
<xsl:template match="/*">
<root>
<xsl:variable name="AddressNames" select="myUtil:getSecondXMLData()"/>
<xsl:for-each select="item">
<AddressName>
<xsl:variable name="curValue" select="position()"/>
<xsl:value-of select="$AddressNames//Item[$curValue]/names"/>
</AddressName>
</xsl:for-each>
</root>
</xsl:template>
我的问题是,当不使用变量来包含当前位置,然后使用它来索引“//Item”集合中的特定项时,我只尝试以下方法
<xsl:value-of select="$AddressNames//Item[position()]/names"/>
我没有得到想要的输出。。。
期望输出:
<root>
<AddressName>rahul sharma</AddressName>
<AddressName>rahul sharma</AddressName>
<AddressName>rahul sharma1</AddressName>
</root>
拉胡尔·夏尔马
拉胡尔·夏尔马
拉胡尔·夏尔马1
接收到错误的输出:
<root xmlns:myUtil="pda:MyUtils">
<AddressName>rahul sharma</AddressName>
<AddressName>rahul sharma</AddressName>
<AddressName>rahul sharma</AddressName>
</root>
拉胡尔·夏尔马
拉胡尔·夏尔马
拉胡尔·夏尔马
输入为:
<?xml version="1.0" encoding="iso-8859-1"?>
<address>
<item p2:type="ns1:sboeconnectCustomerAddressEntityItem" xmlns:p2="http://www.w3.org/2001/XMLSchema-instance">
<customer_address_id p2:type="xsd:string">19221</customer_address_id>
<created_at p2:type="xsd:string">2015-01-21 13:11:13</created_at>
<updated_at p2:type="xsd:string">2015-01-21 13:11:13</updated_at>
<city p2:type="xsd:string">los angeles</city>
<company p2:type="xsd:string">insync</company>
<country_id p2:type="xsd:string">US</country_id>
<firstname p2:type="xsd:string">rahul</firstname>
<lastname p2:type="xsd:string">sharma</lastname>
<postcode p2:type="xsd:string">90066</postcode>
<region p2:type="xsd:string">Alabama@AL</region>
<street p4:arrayType="xsd:string[1]" p2:type="ns1:ArrayOfString" xmlns:p4="http://schemas.xmlsoap.org/soap/encoding/">
<item p2:type="xsd:string">eeee</item>
</street>
<telephone p2:type="xsd:string">8065534367</telephone>
<is_default_billing p2:type="xsd:boolean">true</is_default_billing>
<is_default_shipping p2:type="xsd:boolean">true</is_default_shipping>
</item>
<item>
<customer_address_id>19221</customer_address_id>
<city>los angeles</city>
<country_id>US</country_id>
<region>Alabama@AL</region>
<firstname>rahul</firstname>
<lastname>sharma</lastname>
<postcode>90066</postcode>
<street>
<item p4:type="xsd:string" xmlns:p4="http://www.w3.org/2001/XMLSchema-instance">eeee</item>
</street>
<telephone>8065534367</telephone>
<is_default_billing>false</is_default_billing>
<is_default_shipping>true</is_default_shipping>
</item>
<item p2:type="ns1:sboeconnectCustomerAddressEntityItem" xmlns:p2="http://www.w3.org/2001/XMLSchema-instance">
<customer_address_id p2:type="xsd:string">19222</customer_address_id>
<created_at p2:type="xsd:string">2015-01-21 13:11:13</created_at>
<updated_at p2:type="xsd:string">2015-01-21 13:11:13</updated_at>
<city p2:type="xsd:string">los angeles</city>
<company p2:type="xsd:string">insync</company>
<country_id p2:type="xsd:string">US</country_id>
<firstname p2:type="xsd:string">rahul</firstname>
<lastname p2:type="xsd:string">sharma</lastname>
<postcode p2:type="xsd:string">90066</postcode>
<region p2:type="xsd:string">Alabama@AL</region>
<street p4:arrayType="xsd:string[1]" p2:type="ns1:ArrayOfString" xmlns:p4="http://schemas.xmlsoap.org/soap/encoding/">
<item p2:type="xsd:string">CB-28</item>
</street>
<telephone p2:type="xsd:string">8065534367</telephone>
<is_default_billing p2:type="xsd:boolean">false</is_default_billing>
<is_default_shipping p2:type="xsd:boolean">false</is_default_shipping>
</item>
</address>
19221
2015-01-21 13:11:13
2015-01-21 13:11:13
洛杉矶
同步
美国
拉胡尔
沙玛
90066
Alabama@AL
eeee
8065534367
真的
真的
19221
洛杉矶
美国
Alabama@AL
拉胡尔
沙玛
90066
eeee
8065534367
假的
真的
19222
2015-01-21 13:11:13
2015-01-21 13:11:13
洛杉矶
同步
美国
拉胡尔
沙玛
90066
Alabama@AL
CB-28
8065534367
假的
假的
变量(AddressNames)包含以下信息:
<?xml version="1.0" encoding="UTF-8"?>
<AddressNameCollection>
<Item>
<names>rahul sharma</names>
</Item>
<Item>
<names>rahul sharma</names>
</Item>
<Item>
<names>rahul sharma1</names>
</Item>
</AddressNameCollection>
拉胡尔·夏尔马
拉胡尔·夏尔马
拉胡尔·夏尔马1
不确定你到底在问什么。在XPath中,谓词过滤位置步骤选择的节点集。表达式中的谓词[2]
:
/root/item[2]
/root/item[position()]
过滤项目。这相当于:
/root/item[position() = 2]
其中,position()
作为项目在由root/item
选择的项目节点集中的位置进行计算。表达方式:
/root/item[2]
/root/item[position()]
评估结果如下:
/root/item[position() = position()]
这当然会为任何项返回true,因此这里的谓词没有做任何事情
您试图做的是:
/root/item[position() = current()/position()]
我认为它在XSLT2.0中工作,但在XSLT1.0中不工作。在XSLT 1.0中,必须将上下文项的位置存储在一个变量中,并在谓词中使用该变量(正如您在开始的示例中所做的那样)。您还可以发布当前获得的错误结果吗?您不能将代码最小化到仅演示问题所需的程度吗?不,
current()/position()
不起作用。通常$X/position()
返回序列1、2、3、4。。。N其中N是$X中的项数。由于current()
是长度为1的序列,current()/position()
返回1。您需要将position()
的值绑定到一个变量,然后使用该变量,就像在原始文章中一样。