Объединение разных шаблонов в один общий шаблон - PullRequest
0 голосов
/ 06 января 2011

У меня есть входной файл

main.xml

<?xml version="1.0" encoding="utf-8" ?>
<Employees>
<Employee>
<id name="id">1</id>
<firstname >ABC</firstname>
<lastname >XYZ</lastname>
<age >32</age>
</Employee>
</Employees>

и 2 файла поиска:

Lookup1.xml

 <?xml version="1.0" encoding="utf-8"?>
  <Employees>
  <Employee id="1">
   <department code="102">HR</department>
  </Employee>
  </Employees>

Lookup2.xml

  <?xml version="1.0" encoding="utf-8"?>
  <Employees>
     <Employee id="1">
     <Country code="10">Canada</Country>
     </Employee>
  </Employees>

Я хочу, чтобы вывод был таким, чтобы я передавал значения, разделенные запятыми, в сценарии, например "Страна, Отдел", и он должен генерировать следующий вывод

   <?xml version="1.0" encoding="utf-8" ?>
   <Employees>
   <Employee>
    <id name="id">1</id>
    <firstname >ABC</firstname>
    <lastname >XYZ</lastname>
    <age >32</age>
    <va-object>
    <va-metadata>
     <related-content-ref area="decisions"
        cite="102"
        relationship="department" relevance="100"/>
     <primary-class>
      <super-class super-class="value-add"/>
      <sub-class sub-class="department">HR</sub-class>
    </primary-class>
  </va-metadata>
</va-object>
<va-object>
  <va-metadata>
    <related-content-ref area="decisions"
        cite="10"
        relationship="country" relevance="100"/>
    <primary-class>
      <super-class super-class="value-add"/>
      <sub-class sub-class="country">Canada</sub-class>
    </primary-class>
  </va-metadata>
</va-object>
   </Employee>
   </Employees>

Но если я просто передам "Страна" в качестве параметра, тогда скрипт не должен вставлять Department или наоборот. Я могу добиться этого, имея 2 разных tempaltes для страны и департамента, но я хочу, чтобы это было достигнуто с помощью одного универсального шаблона с параметрами из внешнего файла. Любая помощь будет оценена.

1 Ответ

0 голосов
/ 08 января 2011

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="kElemByParentId" match="Employee/*" use="../@id"/>
    <xsl:param name="pNames" select="'Country department'"/>
    <xsl:variable name="vNames" select="concat(' ',$pNames,' ')"/>
    <xsl:variable name="vLookup" select="document('Lookup1.xml')|
                                         document('Lookup2.xml')"/>
    <xsl:variable name="vUpper" select="'QWERTYUIOPASDFGHJKLZXCVBNM'"/>
    <xsl:variable name="vLower" select="'qwertyuiopasdfghjklzxcvbnm'"/>
    <xsl:template match="node()|@*" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="Employee/*[last()]">
        <xsl:variable name="vKey" select="../id"/>
        <xsl:call-template name="identity"/>
        <xsl:for-each select="$vLookup">
            <xsl:apply-templates select="key('kElemByParentId',$vKey)
                                          [contains($vNames,
                                                    concat(' ',name(),' '))]"
                                 mode="va-object"/>
        </xsl:for-each>
    </xsl:template>
    <xsl:template match="*" mode="va-object">
        <xsl:variable name="vName"
                      select="translate(name(),$vUpper,$vLower)"/>
        <va-object>
            <va-metadata>
                <related-content-ref area="decisions"
                                     cite="{@code}"
                                     relationship="{$vName}"
                                     relevance="100"/>
                <primary-class>
                    <super-class super-class="value-add"/>
                    <sub-class sub-class="{$vName}">
                        <xsl:value-of select="."/>
                    </sub-class>
                </primary-class>
            </va-metadata>
        </va-object>
    </xsl:template>
</xsl:stylesheet>

Вывод:

<Employees>
    <Employee>
        <id name="id">1</id>
        <firstname>ABC</firstname>
        <lastname>XYZ</lastname>
        <age>32</age>
        <va-object>
            <va-metadata>
                <related-content-ref area="decisions"
                                     cite="102"
                                     relationship="department"
                                     relevance="100" />
                <primary-class>
                    <super-class super-class="value-add" />
                    <sub-class sub-class="department">HR</sub-class>
                </primary-class>
            </va-metadata>
        </va-object>
        <va-object>
            <va-metadata>
                <related-content-ref area="decisions"
                                     cite="10"
                                     relationship="country"
                                     relevance="100" />
                <primary-class>
                    <super-class super-class="value-add" />
                    <sub-class sub-class="country">Canada</sub-class>
                </primary-class>
            </va-metadata>
        </va-object>
    </Employee>
</Employees>

Примечание : "В последовательности" XPath 1.0 test:

contains(concat($separator,$sequence,$separator),
         concat($separator,$item,$separator))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...