как сопоставить все узлы, которые имеют ключ в таблице поиска в XSLT - PullRequest
1 голос
/ 30 марта 2012

С учетом входного XML-файла:

        <acctInfo>
                <wfInfo>
                    <aaa>1</aaa>
                    <bbb>1</bbb>
                    <ccc>1</ccc>
                    <ddd>1</ddd>
                    <eee>1</eee>
                </wfInfo>
            <acctInfo>

И поисковый файл:

<fields>
    <field>
       <name>aaa</name>
       <Updatekey>aaakey</Updatekey>
    </field>

    <field>
       <name>bbb</name>
       <Updatekey>bbbkey</Updatekey>
    </field>

    <field>
       <name>ccc</name>
       <Updatekey>ccckey</Updatekey>
    </field>
</fields>

Я хотел бы использовать XSLT / XPATH для подсчета всех узлов во входном XML-файле, имеющих соответствующий ключ в таблице поиска. в приведенном выше примере count должен дать 3. Спасибо.

Ответы [ 3 ]

1 голос
/ 30 марта 2012

Вы можете использовать команду document для ссылки на другой XML-документ в вашем XSLT.

<xsl:value-of 
   select="count(//wfInfo/*[document('Lookup.xml')//field/name = local-name()])" />

т.е. сопоставить все элементы в wfInfo там, где естьимя поля в файле lookup.xml с тем же именем, что и у элемента.

Итак, с учетом следующего XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
   <xsl:template match="/"> 
      <xsl:value-of 
         select="count(//wfInfo/*[document('Lookup.xml')//field/name = local-name()])" />
   </xsl:template> 
</xsl:stylesheet> 

Вывод 3

0 голосов
/ 30 марта 2012

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
     <xsl:value-of select=
     "count(/*/*/*
             [name()
             =
              document('file:///c:/temp/delete/lookup.xml')/*/*/name]
            )"/>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному документу XML (исправлено, чтобы оно было правильно сформировано):

<acctInfo>
    <wfInfo>
        <aaa>1</aaa>
        <bbb>1</bbb>
        <ccc>1</ccc>
        <ddd>1</ddd>
        <eee>1</eee>
    </wfInfo>
</acctInfo>

дает желаемый, правильный результат :

3
0 голосов
/ 30 марта 2012

Попробуйте этот подход:

            ┌─────────┐
            │Meta XSLT│
┌──────────┐└────┬────┘┌──────────┐
│Lookup XML├─────┴────>┤Inner XSLT│
└──────────┘┌─────────┐└────┬─────┘┌──────────┐
            │Input XML├─────┴─────>┤  Output  │
            └─────────┘            └──────────┘

Используйте Meta XSLT, который принимает Lookup XML в качестве ввода, сгенерируйте Intermedia XSLT для обработки вывода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...