Преобразование XSLT для проверки правил в документе XML - PullRequest
1 голос
/ 29 февраля 2012

Еще один вопрос новичка в XSLT-преобразовании.(Я задавал подобный вопрос и раньше, но в этом случае XML имеет разные форматы).

У меня есть XML-документ, который мне нужен для проверки, используя xslt.Это будет сделано с помощью инструмента xsltproc.

<?xml version="1.0" ?>
<Company id="1" ...>
   <Name>blah</Name>
   <Location>
     <Address>zzz</Address>
     <City>aaa</City>
     .....
   </Location>
   ....
   <Manager id="m1" mincount="4" grade="10"...>
      <Employee id="e1"/>
      <Employee id="e2"/>
      .....
   </Manager>
   .....
</Company>

<Employee_List>
  <Employee id="e1" grade="9" Location="New York" p1="value" p2="value"....... />
  <Employee id="e2" grade="8" Location="New York" p1="value" p2="value"....... />
  ......
</Employee_List>

Мне нужно выполнить следующие проверки только для тегов <Manager> и <Employee_List>, т. Е. Меня не волнуют теги местоположения компании и т. Д. Обратите внимание, что в документе xml есть <company> <Employee_List>теги.

  1. Количество сотрудников под менеджером должно быть> = mincount.
  2. Оценки сотрудников под руководством менеджера должны быть <оценки менеджера.</li>
  3. Все сотрудники под руководством менеджера должны находиться в одном месте.(Мне нужны дополнительные проверки, такие как свойства p1 и p2 сотрудников также должны совпадать).

TIA и ценю любую помощь !!

Новые правила для проверки (добавлено 5/5/12).1. Атрибут p1 должен быть либо ALPHA, либо BETA (строка), он не может быть ничем иным.Этот xsl работает для одного сотрудника, а не для нескольких сотрудников.

    <xsl:apply-templates mode="rule5" select=
  "*/*/Manager[not(key('kEmpById', Employee/@id)/@p1 = 'ALPHA' or
               key('kEmpById', Employee/@id)/@p1 = 'BETA')
              ]
  "/>
  1. Идентификатор сотрудника должен быть уникальным.Я пробовал этот xsl, но он не работает :(

    <xsl:apply-templates mode="rule6" select=
    

    " / / Manager [key ('kEmpById', Employee [2] / @ id) / @ id= ключ ('kEmpById', сотрудник / @ id) / @ id] "/>

TIA!

1 Ответ

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

Что-то похожее на следующее :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:key name="kEmpById" match="Employee" use="@id"/>

 <xsl:template match="/">
  <xsl:apply-templates mode="rule1" select=
  "*/*/Manager[@mincount > count(Employee)]"/>

  <xsl:apply-templates mode="rule2" select=
  "*/*/Manager[key('kEmpById', Employee/@id)/@grade > @grade]"/>

  <xsl:apply-templates mode="rule3" select=
  "*/*/Manager[key('kEmpById', Employee[2]/@id)/@Location
             !=
               key('kEmpById', Employee/@id)/@Location
              ]
  "/>
 </xsl:template>

 <xsl:template match="Manager" mode="rule1">
  Manager id = "<xsl:value-of select="@id"/>" has too few employees.

 </xsl:template>

 <xsl:template match="Manager" mode="rule2">
  Manager id = "<xsl:value-of select="@id"/>" has employees with higher grade than his own.

 </xsl:template>

 <xsl:template match="Manager" mode="rule3">
  Manager id = "<xsl:value-of select="@id"/>" has employees at different locations.

 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к предоставленному XML-документу (отредактировано для удаления его серьезного искажения и введения всехвозможные нарушения):

<t>
    <Company id="1" >
        <Name>blah</Name>
        <Location>
            <Address>zzz</Address>
            <City>aaa</City>
        </Location>
        <Manager id="m1" mincount="4" grade="10">
            <Employee id="e1"/>
            <Employee id="e2"/>
        </Manager>
    </Company>
    <Employee_List>
        <Employee id="e1" grade="11" Location="New York" p1="value" p2="value" />
        <Employee id="e2" grade="8" Location="Pittsburgh" p1="value" p2="value" />
    </Employee_List>
</t>

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

  Manager id = "m1" has too few employees.


  Manager id = "m1" has employees with higher grade than his own.


  Manager id = "m1" has employees at different locations.
...