我是XSLT的新手。我有一条XML消息如下:
<Root>
<Payload>
<SendEmail>
<customerID>123123</customerID>
<subscriberID>123123</subscriberID>
<MessageDetails>
<AttributeList>
<Attribute Name="CcEmailAddress">abc@abc.com</Attribute>
<Attribute Name="BcccEmailAddress">abc@abc.com</Attribute>
<Attribute Name="SenderEmailAddress">abc@abc.com</Attribute>
<Attribute Name="SenderMobileNo">abc@abc.com</Attribute>
<Content Name="MobileNo">abc@abc.com</Content>
<Content Value="TxnNO">abc@abc.com</Content>
<ERCo ercvalue="ERCNO">abc@abc.com</ERCo>
<Attribute Name="OrderHeader"><![CDATA[" and ends with "]]></Attribute>
</AttributeList>
</MessageDetails>
<MessageDetails>
<AttributeList>
<Attribute Name="CcEmailAddress">abc@abc.com</Attribute>
<Attribute Name="BcccEmailAddress">abc@abc.com</Attribute>
<Attribute Name="SenderEmailAddress">abc@abc.com</Attribute>
<Attribute Name="SenderMobileNo">abc@abc.com</Attribute>
<Content Name="MobileNo">abc@abc.com</Content>
<Content Value="TxnNO">abc@abc.com</Content>
<ERCo ercvalue="ERCNO">abc@abc.com</ERCo>
<Attribute Name="OrderHeader"><![CDATA[" and ends with "]]></Attribute>
</AttributeList>
</MessageDetails>
</SendEmail>
</Payload>
</Root>
以下是我的要求和问题:
在AttributeList标记中,我必须查找具有特定值的属性“Name”(例如CcEmailAddress),然后将相应的字段值(实际的电子邮件ID)映射到我的目标标记。我试过了 // [@名称= 'CcEmailAddress'] 因为它在我的输入中出现一次,我决定遍历所有属性,名称为Name,值为CcEmailAddress。但它似乎没有起作用。
如何确保我的代码选择特定的出现?在我的情况下,消息详细信息重复n次。如果我在for-each中使用select,它只获取第一个出现的值。当循环在第二个“MessageDetails”上时,我想要获取它们内部的值。我如何实现这一目标?
在AttributeList中,我持有“Attribute”元素和n-others。如果我想搜索“内容”元素并找到属性“名称”= MobileNo的值(MobileNo可以出现在任何标签下,但我只想要重复内容下的内容),我该怎么做?
非常感谢你的帮助。
答案 0 :(得分:1)
我认为这里最好的选择是//Attribute[@Name = 'CcEmailAddress']
或包含Attribute[@Name = 'CcEmailAddress']
的相对路径,具体取决于上下文节点。
您可以使用相对XPath。如果上下文节点是MessageDetails,则可以使用路径AttributeList/Attribute[@Name = 'CcEmailAddress']
与上述类似,如果您只想考虑Content
元素值,则可以使用包含Content[@Name = 'MobileNo']
的路径。同样,由于您正在迭代MessageDetails
,这可能是AttributeList/Content[@Name = 'MobileNo']