2012-06-10 2 views
0

Вот XML-файл:XML и XSLT применимы-шаблоны выбора

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="2.xsl" ?> 


<root> 
    <shop> 
     <person> 
      <employee> 
       <name> Alexis </name> 
       <role> Manager </role> 
       <task> Sales </task> 
      </employee> 

      <employee> 
       <name> Employee2 </name> 
      </employee> 
     </person> 

     <employee> 
      <name> Blake2 </name> 
     </employee> 

    </shop> 



    <person> 
     <employee2> 
      <role2> Supervisor </role2> 
      <name2> Blake </name2> 
      <task2> Control </task2> 
     </employee2> 
    </person> 
</root> 

Вот файл XSLT:

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 



<xsl:template match="root"> 
<html><head></head> 
<body> 
Start of root in XSLT <p/> <xsl:apply-templates select="person" /> <p/> 

End of root in XSLT 

</body> 
</html> 
</xsl:template> 



<xsl:template match="shop"> 
"Step 1 start" 
<xsl:apply-templates select="*/*"/> 
"Step 1 done" <p/> 
</xsl:template> 



<xsl:template match="employee"> 
<u> <xsl:apply-templates select="name"/> </u> 
(Task: <xsl:apply-templates select="task"/>) 
<br></br> 
</xsl:template> 


</xsl:stylesheet> 

Выход:

Начало корня в XSLT

Контролер Блейк

Конец корня в XSLT

Мой вопрос, почему не Алексис и Employee2 часть продукции? Они оба находятся под элементом <person> .....

ответ

0

<xsl:template match="root"> прилагается к элементу <root>. В нем <xsl:apply-templates select="person" /> выбирает элемент <person>, который является непосредственным дочерним элементом текущего узла (корневой элемент <root>). Поскольку шаблон не определен для <person>, выполняется поведение по умолчанию XSLT, что означает, что копируются только текстовые узлы.

Другие шаблоны не выполняется вообще, так как нет <shop> или <employee> элементов на корневом уровне (относительно самого документа), и шаблоны не вызываются через <apply-templates>, либо.

Чтобы ответить на ваш вопрос более явно, первый <person> элемент не выбран потому, что он вложен в другой элемент, но ваша <apply-templates> инструкция выбирает только <person> элементы, которые непосредственно видны в текущем узле.

+0

Спасибо, я понимаю сейчас! – shadowz1337

0

Но вы не хотите, чтобы любой человек, не так ли? В случае, если вы это делаете, но не знаете, как это сказать, просто прореживайте немного, например <xsl:apply-templates select="//person" />

Смежные вопросы