复杂属性的XSL转换

时间:2013-03-19 02:00:17

标签: xml xslt complexity-theory xslt-2.0

我是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>

以下是我的要求和问题:

  1. 在AttributeList标记中,我必须查找具有特定值的属性“Name”(例如CcEmailAddress),然后将相应的字段值(实际的电子邮件ID)映射到我的目标标记。我试过了 // [@名称= 'CcEmailAddress'] 因为它在我的输入中出现一次,我决定遍历所有属性,名称为Name,值为CcEmailAddress。但它似乎没有起作用。

  2. 如何确保我的代码选择特定的出现?在我的情况下,消息详细信息重复n次。如果我在for-each中使用select,它只获取第一个出现的值。当循环在第二个“MessageDetails”上时,我想要获取它们内部的值。我如何实现这一目标?

  3. 在AttributeList中,我持有“Attribute”元素和n-others。如果我想搜索“内容”元素并找到属性“名称”= MobileNo的值(MobileNo可以出现在任何标签下,但我只想要重复内容下的内容),我该怎么做?

  4. 非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

  1. 我认为这里最好的选择是//Attribute[@Name = 'CcEmailAddress']或包含Attribute[@Name = 'CcEmailAddress']的相对路径,具体取决于上下文节点。

  2. 您可以使用相对XPath。如果上下文节点是MessageDetails,则可以使用路径AttributeList/Attribute[@Name = 'CcEmailAddress']

  3. 与上述类似,如果您只想考虑Content元素值,则可以使用包含Content[@Name = 'MobileNo']的路径。同样,由于您正在迭代MessageDetails,这可能是AttributeList/Content[@Name = 'MobileNo']