2013-08-20 3 views
0

Я получил XML выглядеть как этотКак выбрать несколько дочерний узел в XML

<Details> 
    <UserResource> 
    <ResourceGroup>AJD-IPSP1</ResourceGroup> 
    <ResourceType>master</ResourceType> 
    <Access>r</Access> 
    <UseSOAPFault>soap </UseSOAPFault> 
    </UserResource> 
    <UserResource> 
    <ResourceGroup>AJD-VME1</ResourceGroup> 
    <ResourceType>trx</ResourceType> 
    <Access>r</Access> 
    <UseSOAPFault>soap </UseSOAPFault> 
    </UserResource> 
    <UserResource> 
    <ResourceGroup>AJD-VME10</ResourceGroup> 
    <ResourceType>trx</ResourceType> 
    <Access>r</Access> 
    <UseSOAPFault>soap </UseSOAPFault> 
    </UserResource> 
    <UserResource> 
    <ResourceGroup>AJD-VME11</ResourceGroup> 
    <ResourceType>trx</ResourceType> 
    <Access>r</Access> 
    <UseSOAPFault>soap </UseSOAPFault> 
    </UserResource> 
</Details> 

что я пытаюсь достичь:

/Details/UserResource[ResourceGroup="AJD-VME10" or ResourceGroup="AJD-VME1"] 

Результат должен быть

<UserResource> 
    <ResourceGroup>AJD-VME1</ResourceGroup> 
    <ResourceType>trx</ResourceType> 
    <Access>r</Access> 
    <UseSOAPFault>soap </UseSOAPFault> 
    </UserResource> 
    <UserResource> 
    <ResourceGroup>AJD-VME10</ResourceGroup> 
    <ResourceType>trx</ResourceType> 
    <Access>r</Access> 
    <UseSOAPFault>soap </UseSOAPFault> 
    </UserResource> 

Как я могу сделать это xpath?

Я хочу сделать это, просто используя один xpath.

+1

В чем проблема? Не работает ли выражение XPath в вопросе? – mzjn

+0

Вы, похоже, работаете с выражением xPath ... Разве это не так? какой результат вы получаете? – Enissay

+0

Я пишу запрос db2. SELECT SECTIONTITLE, VMETE.COALESCE_XML (XMLQUERY ('$ c/Details/UserResource [ResourceGroup = "AJD-VME10" или ResourceGroup = "AJD-VME1"], передающий i.SECTIONCONTENT как " c "), i.SECTIONCONTENT) как SECTIONCONTENT FROM IPSP_CONFIGURATION i WHERE IPSPID = 'AJD-IPSP1' и EFFECTIVETO = '9999-12-31-23.59.59' не работает. но если я изменю [ResourceGroup = "AJD-VME10" или ResourceGroup = "AJD-VME1"] на [ResourceGroup = "AJD-VME10"], это сработает. Я думаю, что это может быть проблема xpath. – Larry

ответ

0

Вот простой способ сделать это. Если вам удобно работать с циклами, вы можете пройти через каждый из UserResources и проверить, соответствует ли ResourceGroup/text() термину.

let $x := 
<Details> 
    <UserResource> 
    <ResourceGroup>AJD-IPSP1</ResourceGroup> 
    <ResourceType>master</ResourceType> 
    <Access>r</Access> 
    <UseSOAPFault>soap </UseSOAPFault> 
    </UserResource> 
    <UserResource> 
    <ResourceGroup>AJD-VME1</ResourceGroup> 
    <ResourceType>trx</ResourceType> 
    <Access>r</Access> 
    <UseSOAPFault>soap </UseSOAPFault> 
    </UserResource> 
    <UserResource> 
    <ResourceGroup>AJD-VME10</ResourceGroup> 
    <ResourceType>trx</ResourceType> 
    <Access>r</Access> 
    <UseSOAPFault>soap </UseSOAPFault> 
    </UserResource> 
    <UserResource> 
    <ResourceGroup>AJD-VME11</ResourceGroup> 
    <ResourceType>trx</ResourceType> 
    <Access>r</Access> 
    <UseSOAPFault>soap </UseSOAPFault> 
    </UserResource> 
</Details> 


return $x/UserResource[ResourceGroup="AJD-VME10" or ResourceGroup="AJD-VME1"] 
0

Вот XSL решение:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="Details"> 
    <xsl:apply-templates select="UserResource" /> 
</xsl:template> 

<xsl:template match="UserResource"> 
    <xsl:if test="ResourceGroup='AJD-VME10' or ResourceGroup='AJD-VME1'"> 
     <xsl:element name="{name()}"> 
      <xsl:copy-of select="*" /> 
     </xsl:element> 
    </xsl:if> 

</xsl:template> 

0

Вы говорите, что ваш запрос DB2 является

SELECT SECTIONTITLE, VMETE.COALESCE_XML( 
     XMLQUERY(
     '$c/Details/UserResource 
      [ResourceGroup="AJD-VME10" 
      or ResourceGroup="AJD-VME1"]' 
      passing i.SECTIONCONTENT as "c"), 
     i.SECTIONCONTENT) 
     as SECTIONCONTENT 
    FROM IPSP_CONFIGURATION i 
WHERE IPSPID='AJD-IPSP1' 
    AND EFFECTIVETO='9999-12-31-23.59.59' 

Как уже отмечалось других, XPath здесь синтаксически и семантически верный; Я был бы склонен заподозрить возможное затруднение в интерфейсе SQL/XQuery: в среде оценки XQuery $c будет привязан к узлу элемента для элемента Details или к узлу документа с этим элементом в качестве его дочернего элемента? Такого рода вещи легко ошибиться, но их легко исправить.

Но тогда вы говорите, что эта форма "не работает, но если я изменю [ResourceGroup =" AJD-VME10 "или ResourceGroup =" AJD-VME1 "] на [ResourceGroup =" AJD-VME10 "] он работает.

Это просто странно. Если предложение Natkeeran о скобках двух дизъюнкций работает, то используемая вами система имеет ошибку в своем парсере (что кажется маловероятным для DB2). Вы абсолютно уверены, что единственное разница между запросом, который работает как ожидалось, и тем, который ничего не возвращает, является удаление or ResourceGroup="AJD-VME1" из предиката?

Смежные вопросы