Как сравнить значение двух узлов в XSLT

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

Мой образец 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 (для равенства). Я использую XSLT2.


person Bijendra Singh    schedule 14.05.2009    source источник
comment
@Эндрю Хэйр: О нет! Изменить клоббер. Честно говоря, я думаю, что моя обработка лучше вашей. Вы пропустили кучу.   -  person Welbog    schedule 14.05.2009
comment
Поскольку вы, по-видимому, еще не добились успеха, я думаю, вам следует добавить свой код к этому вопросу. Тогда люди могут помочь вам отладить его.   -  person Evan Lenz    schedule 15.05.2009


Ответы (3)


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

<xsl:if 
  test="/G1Export/AgencyGroup/Agency/OrgId = /G1Export/BranchGroup/BranchCode/OrgId">
person Welbog    schedule 14.05.2009
comment
Я пробовал ‹xsl:имя переменной=orgId select=string(Agency/OrgId) /› ‹xsl:имя переменной=brnchOrgId select=string(BranchCode/OrgId) /› match:‹xsl:value-of select=$brnchOrgId=$ orgId/› это дает ложь. В моем файле xml значение узла Agency/OrgId равно 123, а BranchCode/OrgId также равно 123. - person Bijendra Singh; 14.05.2009
comment
Нет контекста, в котором Agency/OrgId и BranchCode/OrgId будут возвращать фактические значения, потому что на этом уровне у них нет общего родителя. Используйте полные пути, которые у меня есть в моем примере. и скажите мне, если это работает. - person Welbog; 14.05.2009
comment
Я попробовал это ‹xsl:value-of select=/G1Export/AgencyGroup/Agency/OrgId = /G1Export/BranchGroup/BranchCode/OrgId/›, но все равно это возвращает мне ложь. - person Bijendra Singh; 15.05.2009

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

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

person alamar    schedule 14.05.2009
comment
Я пробовал ‹xsl:имя переменной=orgId select=string(Agency/OrgId) /› ‹xsl:имя переменной=brnchOrgId select=string(BranchCode/OrgId) /› match:‹xsl:value-of select=$brnchOrgId=$ orgId/› это дает ложь. В моем файле xml значение узла Agency/OrgId равно 123, а BranchCode/OrgId также равно 123. - person Bijendra Singh; 14.05.2009
comment
Они оба возвращают мне одно и то же значение. ‹xsl:value-of select=Agency/OrgId /›output:123 ‹xsl:value-of select=BranchCode/OrgId /›output:123 Согласно моему образцу XML-файла. - person Bijendra Singh; 15.05.2009

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

результат = 0

Отредактировано: в xslt было 2 ошибки. 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>

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

person SO User    schedule 14.05.2009
comment
Привет, Рашми, ты хочешь сказать, что я должен использовать метод comapare с Xpath обоих узлов. Сравнивает ли метод compare() только значение узла и положение этого узла в файле xml? - person Bijendra Singh; 14.05.2009
comment
Он сравнивает 2 строки (в данном случае только значения), используя параметры сортировки по умолчанию. Для получения дополнительной информации см. эту ссылку: xsltfunctions.com/xsl/fn_compare.html - person SO User; 14.05.2009
comment
Я пробовал ‹xsl:имя переменной=orgId select=string(Agency/OrgId) /› ‹xsl:имя переменной=brnchOrgId select=string(BranchCode/OrgId) /› match:‹xsl:value-of select=$brnchOrgId=$ orgId/› это дает ложь. В моем файле xml значение узла Agency/OrgId равно 123, а BranchCode/OrgId также равно 123. - person Bijendra Singh; 15.05.2009
comment
Это потому, что ваши xpaths неверны. Из одного места нельзя использовать Agency/OrgId и BranchCode/OrgId. Попробуйте с AgencyGroup/Agency/OrgId и AgencyGroup/BranchCode/OrgId. Это зависит от вашего текущего местоположения. Это поможет, если вы разместите образец своего xslt или, по крайней мере, сообщите мне, в каком шаблоне вы объявляете эти переменные. - person SO User; 15.05.2009
comment
‹xsl:stylesheet exclude-result-prefixes=exslt saxon bpws cis ihmap version=2.0 xmlns:bpws=schemas.xmlsoap.org/ws/2003/03/business-process xmlns:cis=approuter.com/schemas/2003/1/UserCallouts xmlns:exslt=exslt.org/common xmlns:ihmap=approuter.com/xmlns/2002/Mapping xmlns:saxon=saxon.sf.net xmlns:xml=w3.org/XML/1998/namespace xmlns:xsd=w3.org/2001/XMLSchema xmlns:xsi=w3.org /2001/XMLSchema-instance xmlns:xsl=w3.org/1999/XSL/ Преобразование - person Bijendra Singh; 15.05.2009
comment
‹xsl:выходная кодировка=UTF-8 отступ=да method=xml /› ‹xsl:имя переменной=srcDoc1 select=bpws:getVariableData('g1Export') /› ‹xsl:template match=/› ‹xsl:имя элемента= PICRESPONSE namespace=fieldpoint.com/namespaces› ‹xsl:for-each select=$srcDoc1/G1Export/ AgencyGroup› ‹xsl:if test=count(.) 0› ‹!--org_id variable--› ‹xsl:variable name=orgId select=string(/G1Export/AgencyGroup/Agency/OrgId) /› - person Bijendra Singh; 15.05.2009
comment
‹xsl:element name=EXPORTRESPONSE namespace=fieldpoint.com/namespaces› ‹xsl:for-each select =$srcDoc1/G1Export/BranchGroup› ‹xsl:if test=count(.) 0› ‹xsl:variable name=brnchOrgId select=string(/G1Export/AgencyGroup/BranchCode/OrgId) /› ‹!-- Поместите информацию о филиале внутри текущего узла агентства, только если ветка принадлежит текущему агентству --> ‹xsl:if test=compare($brnchOrgId,$orgId)='0'› ‹xsl:value-of select='orgid совпадает с branchogid'/ › - person Bijendra Singh; 15.05.2009
comment
‹/xsl:if› ‹/xsl:if› ‹/xsl:for-each› ‹/xsl:element› ‹/xsl:if› ‹/xsl:for-each› ‹/xsl:element› ‹/xsl: template› ‹/xsl:stylesheet› Это мой файл xslt, который будет обрабатывать мой файл xml - person Bijendra Singh; 15.05.2009