位置函数 return 值无法索引集合中的特定节点
Position function return value not able to index a specific node in a collection
我有下面的 XSLT,它工作正常:
<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>
收到错误的输出:
<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>
变量 (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>
不确定你到底在问什么。在 XPath 中,谓词过滤由定位步骤选择的节点集。表达式中的谓词 [2]
:
/root/item[2]
过滤项目。相当于:
/root/item[position() = 2]
其中 position()
被评估为项目在 root/item
选择的项目节点集中的位置。表达式:
/root/item[position()]
被评估为:
/root/item[position() = position()]
这当然对任何项目都 return 为真,所以这里的谓词没有做任何事情。
您要执行的操作类似于:
/root/item[position() = current()/position()]
在 XSLT 2.0 中有效(我认为),但在 XSLT 1.0 中无效。在 XSLT 1.0 中,您必须将上下文项的位置存储在一个变量中,并在谓词中使用该变量(正如您在开头示例中所做的那样)。
我有下面的 XSLT,它工作正常:
<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>
收到错误的输出:
<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>
变量 (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>
不确定你到底在问什么。在 XPath 中,谓词过滤由定位步骤选择的节点集。表达式中的谓词 [2]
:
/root/item[2]
过滤项目。相当于:
/root/item[position() = 2]
其中 position()
被评估为项目在 root/item
选择的项目节点集中的位置。表达式:
/root/item[position()]
被评估为:
/root/item[position() = position()]
这当然对任何项目都 return 为真,所以这里的谓词没有做任何事情。
您要执行的操作类似于:
/root/item[position() = current()/position()]
在 XSLT 2.0 中有效(我认为),但在 XSLT 1.0 中无效。在 XSLT 1.0 中,您必须将上下文项的位置存储在一个变量中,并在谓词中使用该变量(正如您在开头示例中所做的那样)。