在带有前缀的节点中进行 XPATH 查找

Han*_*nsB 1 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>
Run Code Online (Sandbox Code Playgroud)

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

/request/values/Invoices*
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助 :-)

Tom*_*lak 5

/request/values/*[starts-with(name(), 'Invoices')]
Run Code Online (Sandbox Code Playgroud)

这是一个很好的例子,说明了如何使用 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>
Run Code Online (Sandbox Code Playgroud)

现在更明智的/request/values/Invoice做法会起作用。

使用 XML 应避免的事情

  • 元素名称末尾带有计数器。同一类型的事物应该具有相同的名称。如果发票 ID 很重要,请创建 ID 属性或子元素。如果您只想表达“这是第二张发票”,那么,好吧:它是<Invoice>XML 中的第二张发票。
  • “结构化”元素名称。XML 本身就是结构化的。不要制作类似<case_Email>.
  • 存储从 XML 结构中显而易见的值的属性。之类的东西<values count="9">都是多余的。如果你想数孩子们,就数他们吧。绝对不需要在任何地方存储计数。