2013-07-01 3 views
1

Я совершенно новый для XSLT. И поэтому я столкнулся с некоторыми трудностями. Мне нужно преобразовать довольно большой XML в новый XML. Однако, как я прохожу, я столкнулся с некоторыми трудностями:Как управлять порядком генерации элементов в xsl

Входной XML может быть как:

<Employees> 
    <Employee> 
    <Name>A</Name> 
    <Role>Manager</Role> 
    <Salary>5000$</Salary> 
    </Employee> 
    <Employee> 
    <Name>A</Name> 
    <Role>Director</Role> 
    <Salary>8000$</Salary> 
    </Employee> 
</Employees> 

и вывод XML должен быть как:

<Manager> 
     <Employee_Name>A</Employee_Name> 
</Manager> 
<Count_Of_Employee>2</Count_Of_Employee> 
<Director> 
     <Employee_Name>B</Employee_Name> 
</Director> 

Теперь, если, Я применим шаблон <xsl:Employees/Employee>, затем он будет проверять каждого сотрудника и создаст тег Director сразу после тега менеджера.

Следовательно, при выполнении проверки против XSD он будет терпеть неудачу, поскольку он ожидает, что между ними будет тег coutn.

Итак, мой первый вопрос: как я могу контролировать порядок узлов выходных элементов при написании общего шаблона?

Мой другой вопрос: я должен преобразовать большой XML, так что я не хочу писать <xsl:element> каждый раз, когда я генерирующий тег ..

Я пытался искать различные общие шаблоны .. но не мог 't найти или написать хороший общий шаблон для генерации элемента, для которого имя тега (в целевом xml) не совпадает с именем (в исходном XML) [я нашел несколько общих шаблонов, для которых имя элемента одинаково для обоих XML].

Может кто-то пожалуйста, помогите мне об этом .. я посмотрел в стандартной libraray XSL, а .., но не мог найти хорошую альтернативу ..

Любое предложение или soultion было бы большим подспорьем для меня ,

+0

Вы проявите некоторый входной образец и желаемый результат; это хорошо. Но вам нужно также показать нам достаточно XSLT, который вы используете, чтобы позволить читателям вопроса понять, что вы делаете (а затем, если можно, диагностируйте, что это не так в том, что вы делаете). –

ответ

0

эталонная реализация:

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <!--Suppress unmatched text--> 
    <xsl:template match="text()" /> 

    <xsl:template match="/"> 
    <root> 
     <Manager> 
       <Employee_Name> 
       <xsl:apply-templates select="Employees/Employee[Role/. = 'Manager']"/> 
       </Employee_Name> 
     </Manager> 
     <Count_Of_Employee> 
       <xsl:value-of select="count(Employees/Employee)"/> 
     </Count_Of_Employee> 
     <Director> 
       <Employee_Name> 
       <xsl:apply-templates select="Employees/Employee[Role/. = 'Director']"/> 
       </Employee_Name> 
     </Director> 
    </root> 
    </xsl:template> 

    <xsl:template match="Employee"> 
     <xsl:value-of select="Name"/> 
    </xsl:template> 
</xsl:stylesheet> 
Смежные вопросы