2009-05-14 4 views
2

Я новичок в XSLT. Мне нужна помощь, сравнивающая значение значений двух узлов в XML.Как сравнить значение двух узлов в XSLT

Мой образец XML:

<?xml version="1.0" encoding="utf-8"?> 
<G1Export xmlns=""> 
    <AgencyGroup xmlns=""> 
     <Agency xmlns=""> 
      <RecordType xmlns="">RecordType</RecordType> 
      <OrgId xmlns="">123</OrgId> 
     </Agency> 
    </AgencyGroup> 
    <BranchGroup xmlns=""> 
     <BranchCode xmlns=""> 
      <OrgId xmlns="">123</OrgId> 
     </BranchCode> 
    </BranchGroup> 
</G1Export> 

В указанном файле XML мне нужно сравнить значения OrgId узла под <AgencyGroup> узла к одному под <BranchGroup> узла.

Я попытался использовать метод compare(), но это дает мне результат 1. Фактический результат должен быть 0 (для равных). Я использую XSLT 2.

+0

@Andrew Hare: О нет! Редактировать clobber. Честно говоря, мое редактирование лучше, чем ваше. Вы пропустили кучу. – Welbog

+0

Я объединю два изменения. – Welbog

+0

Поскольку вы, видимо, еще не добились успеха, я думаю, вы должны добавить свой код к этому вопросу. Тогда люди могут помочь вам отладить его. –

ответ

0
//G1Export/compare(AgencyGroup//OrgId, BranchGroup//OrgId) 

результат = 0

Отредактировано: Были 2 ошибки в XSLT 1. Для brnchOrgId вы использовали AgencyGroup вместо BranchGroup 2. Для сравнения() вы должны иметь = 0, а не = '0'

Исправлено XSLT:

<xsl:template match="/"> 
     <xsl:element name="PICRESPONSE" namespace="fieldpoint.com/namespaces"> 
      <xsl:for-each select="//G1Export/AgencyGroup"> 
       <xsl:if test="count(.) &gt; 0"> 
        <!--org_id variable--> 
        <xsl:variable name="orgId" select="string(/G1Export/AgencyGroup/Agency/OrgId)"/> 
        <xsl:element name="EXPORTRESPONSE" namespace="fieldpoint.com/namespaces">; <xsl:for-each select="//G1Export/BranchGroup"> 
          <xsl:if test="count(.) &gt; 0"> 
           <xsl:variable name="brnchOrgId" select="string(/G1Export/BranchGroup/BranchCode/OrgId)"/>        
           <!--Put the Branch information inside the current agency node only if branch belong to current Agency--> 
           <xsl:if test="compare($brnchOrgId,$orgId)=0">asda 
            <xsl:value-of select="'orgid is same as branchogid'"/> 
           </xsl:if> 
          </xsl:if> 
         </xsl:for-each> 
        </xsl:element> 
       </xsl:if> 
      </xsl:for-each> 
     </xsl:element> 
    </xsl:template> 

Выход:

<?xml version="1.0" encoding="UTF-8"?> 
<PICRESPONSE xmlns="fieldpoint.com/namespaces"> 
    <EXPORTRESPONSE>; orgid is same as branchogid</EXPORTRESPONSE> 
</PICRESPONSE> 

Надеюсь, это поможет.

+0

Hi Rashmi, U означает, что я использую метод comapare с помощью Xpath обоих узлов. Сравнивает ли метод compare() только значение узла и положение этого узла в файле xml? –

+0

Он сравнивает 2 строки (в данном случае только значения), используя сортировку по умолчанию. Дополнительную информацию см. По этой ссылке: http://www.xsltfunctions.com/xsl/fn_compare.html –

+0

Я пробовал match: это дает false. В моем XML-файле значение узла Agency/OrgId равно 123, а BranchCode/OrgId также равно 123. –

1

Почему бы не сделать AgencyGroup/Agency/OrgId = BranchGroup/BranchCode/OrgId? Для дополнительного анального, AgencyGroup/Agency/OrgId/text() = BranchGroup/BranchCode/OrgId/text().

Если вам нужна разница, рассмотрим AgencyGroup/Agency/OrgId - BranchGroup/BranchCode/OrgId

+0

Я попытался \t соответствие: Это дает false. В моем XML-файле значение узла Agency/OrgId равно 123, а BranchCode/OrgId также равно 123. –

+0

Оба они возвращают мне то же значение. output: 123 output: 123 Согласно моему образцу XML-файла. –

3

Я не знаю, контекст, в котором вы должны сравнить эти значения, но оператор = является то, что вы ищете. Это будет сравнивать их, но, возможно, это не тот контекст, в котором вы нуждаетесь:

<xsl:if 
    test="/G1Export/AgencyGroup/Agency/OrgId = /G1Export/BranchGroup/BranchCode/OrgId"> 
+0

Я пробовал match: , это дает false. В моем XML-файле значение узла Agency/OrgId равно 123, а BranchCode/OrgId также равно 123 –

+0

Нет никакого контекста, в котором Agency/OrgId и BranchCode/OrgId оба возвращают действительные значения, потому что на этом уровне у них нет общего родителя , Используйте все пути, которые у меня есть в моем примере. и скажите мне, если это сработает. – Welbog

+0

Я пробовал это , но все же это возвращает меня false. –