XPATH在具有前缀的节点中查找

时间:2016-12-14 14:18:14

标签: xslt xpath

我有这样的XML:

<request type="POST">
<paths count="0"/>
<values count="9">
    <Invoices1>123ABC</Invoices1>
    <Invoices2>456EFG</Invoices2>
    <Invoices3>789HIJ</Invoices3>
    <Invoices4>012KLM</Invoices4>
    <case_Email>Email</case_Email>
    <case_Print>case_Print</case_Print>
    <case_Fax>Fax</case_Fax>
    <zone_TexteReponse>jkg</zone_TexteReponse>
    <Editer>Editer</Editer>
</values>

我会使用XSL来转换这个XML,但我正在努力使用标签Invoicexxx。 如何使用XPath选择它们:

/request/values/Invoices*

感谢您的帮助: - )

3 个答案:

答案 0 :(得分:3)

/request/values/*[starts-with(name(), 'Invoices')]

这是如何使用XML的一个很好的例子。以下是此XML的外观:

<request type="POST">
    <paths />
    <values>
        <Invoice>123ABC</Invoice>
        <Invoice>456EFG</Invoice>
        <Invoice>789HIJ</Invoice>
        <Invoice>012KLM</Invoice>
        <case>
            <Email>Email</Email>
            <Print>Print</Print>
            <Fax>Fax</Fax>
        </case>
        <zone>
            <TexteReponse>jkg</TexteReponse>
        </zone>
        <Editer>Editer</Editer>
    </values>    
</request>

现在一个更明智的/request/values/Invoice会起作用。

使用XML避免的事情

  • 结尾有计数器的元素名称。相同类型的东西应该具有相同的名称。如果发票ID很重要,请创建ID属性或子元素。如果您只想表达“这是第二张发票”那么,那么:这是XML中的第二个<Invoice>
  • “结构化”元素名称。 XML本身就是结构化的。不要制作<case_Email>等元素。
  • 存储从XML结构中不言而喻的值的属性。像<values count="9">这样的东西是多余的。如果你想数数孩子,请数数。无需在任何地方存储计数。

答案 1 :(得分:1)

这是一种方式:

/request/values/*[starts-with(name(), 'Invoices')]

答案 2 :(得分:1)

使用路径/request/values/*[starts-with(local-name(), 'Invoices')]