2014-07-14 38 views
1

我有以下XML结构:XPath查询随着多个阵列

<xml> 
    <header> 
     (Tags goes here) 
    </header> 
    <listItem> 
     <id></id> 
     ... 
     (Sort of data) 
     ... 
     <arrayType1> 
      <id></id> 
      <parentId></parentId> 
      <!-- Key: Data to lookup and get the entire structure (listItem) with XPath--> 
      <key></key> 
     </arrayType1> 
     <arrayType2> 
      <id></id> 
      <parentId></parentId> 
      <!-- Key: Data to lookup and get the entire structure (listItem) with XPath--> 
      <key></key> 
     </arrayType2> 
    </listItem> 
    <listItem> 
     (Exactly same structure with different data as above) 
    </listItem> 
</xml> 

标签<parentId>具有<listItem><id>标签的相同的数据(不要与各arrayType中的<id>混淆)。

我需要一个XPath表达式,该表达式返回只有数据的<parentId><listItem><id>(或者,默认情况下,返回整个arrayTypeX,稍后再处理另一个XSLT转换)。

我需要在IBM Integration Designer(Websphere ESB)的XSLT Map中进行转换,但是我对XPath表达式很困惑,但重点仅仅在于构建XPath Expression。

我试图与此表达式:

/的listItem [arrayType1 [键= '值']] /的parentID

但我不知道的XPath支持内部那种语法(阵列数组寻找一个特定的值)。该表达式总是返回列表的第一个ID。

每个项目的基数是:

header: [0..1] 
listItem: [0..*] 
arrayType1: [0..*] 
arrayType2: [0..*] 

你能摆脱这个一些轻?

由于

编辑:这是一个例子:

只有具有
<xml> 
    <header> 
     (Tags goes here) 
    </header> 
    <listItem> 
     <id>1</id> 
     <arrayType1> 
      <id>1000</id> 
      <parentId>1</parentId> 
      <key>abc</key> 
     </arrayType1> 
     <arrayType1> 
      <id>1500</id> 
      <parentId>1</parentId> 
      <key>mno</key> 
     </arrayType1> 
     <arrayType2> 
      <id>2000</id> 
      <parentId>1</parentId> 
      <key>def</key> 
     </arrayType2> 
    </listItem> 
    <listItem> 
     <id>2</id> 
     <arrayType1> 
      <id>3000</id> 
      <parentId>2</parentId> 
      <key>ghi</key> 
     </arrayType1> 
     <arrayType2> 
      <id>4000</id> 
      <parentId>2</parentId> 
      <key>jkl</key> 
     </arrayType2> 
    </listItem> 
</xml> 

<key>(例如, “GHI”)中,i期望获得<id><parentId> “2”,与XPath表达式。

+0

请先更正此行:'我需要一个返回或只有数据的XPath表达式,并且还请提供一个我期待的示例输入/输出 – sunbabaphu

+0

@sunbabaphu我的错误,这是一个错误代码格式。另外我附上了一个我想要得到的例子。 –

回答

1

如果<parentId><key>的顺序被保持,即,在每个<arrayTypeX><key>之前<parent>出现那么这将工作:

//key[text()="value"]/preceding-sibling::parentId[1] 

为例如:
key = "jkl"的回报将是2

不过,这里必须提到的是,如果需要的话,可以调整,以占多项匹配<key>以及没有特定的顺序为<parent><key>

+0

正如你所说,它工作!谢谢。 –