XSL

2015-06-10 3 views
0

Учитывая этот XML:XSL

<?xml version="1.0" encoding="iso-8859-2" ?> 
    <products> 
     <p> 
      <id> 50 </id> 
      <name> Murphy </name> 
      <price> 33 </price> 
     </p> 
     <p> 
      <id> 40 </id> 
      <name> Eddie </name> 
      <price> 9999 </price> 
     </p> 
     <p> 
      <id> 20 </id> 
      <name> Honey </name> 
      <price> 9999 </price> 
     </p> 
     <p> 
      <id> 30 </id> 
      <name> Koney </name> 
      <price> 11 </price> 
     </p> 
     <p> 
      <id> 10 </id> 
      <name> Margarethe </name> 
      <price> 11 </price> 
     </p> 
    </products> 

С помощью этого XSL:

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

<xsl:template match="p[id &gt; 20]"> 
    <idKP> <xsl:value-of select="id"/></idKP> 
    <skitter><xsl:value-of select="name"/></skitter> 
</xsl:template> 


<xsl:template match="/"> 
    <xsl:apply-templates/> 
</xsl:template> 
</xsl:stylesheet> 

Имея этот вывод:

<?xml version="1.0"?> 
<idKP>50</idKP><skitter>Murphy</skitter> 
<idKP>40</idKP><skitter>Eddie</skitter> 
20 
Honey 
9999 
<idKP>30</idKP><skitter>Koney</skitter> 
10 
Margarethe 
11 

Q: Почему существуют ценности тех, кто не соответствует? 20, Honey, 9999, ...

ответ

1

Из-за built-in template rules - когда нет никаких явных шаблонов, чтобы соответствовать конкретному узлу, используются встроенные правила, которые для узлов элементов означает <xsl:apply-templates/> и для текстовых узлов означает <xsl:value-of select="."/>. Эффект этих двух правил в совокупности состоит в том, чтобы выводить весь текст под элементами, но не сами теги элементов.

Вы можете добавить второй шаблону ничегонеделания

<xsl:template match="p" /> 

полностью игнорировать p элементы, которые не соответствуют вашему условию. Явный шаблон, даже бездействующий, предпочтительнее стандартного встроенного правила.

+0

Если бы вы могли разработать более о 'явном templates' я был бы очень благодарен. –

+0

Все, что я подразумеваю под «явным», это «xsl: template», который вы написали в своей таблице стилей, в отличие от «неявных» встроенных правил. –

0

Чтобы добавить к ответу, это решение:

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

<xsl:template match="p[id &gt; 20]"> 
    <idKP> <xsl:value-of select="id"/></idKP> 
    <skitter><xsl:value-of select="name"/></skitter> 
</xsl:template> 

<xsl:template match="p"/> 

</xsl:stylesheet>