Это может быть достигнуто с помощью очень короткого и простого преобразования - нет <xsl:for-each>
, нет <xsl:if>
, <xsl:choose>
, <xsl:when>
, вообще нет <xsl:attribute>
:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="Book[Web/text()]">
<p>
<a href="{Web}">
<xsl:value-of select="Pub"/>
</a>
</p>
</xsl:template>
<xsl:template match="Book">
<p>
<xsl:value-of select="Pub"/>
</p>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к предоставленному документу XML :
<Catalog>
<Book>
<AName>Steven Holzner</AName>
<BName>Using XSLT</BName>
<Pub>ABC Publication </Pub>
<Web>http://www.ABCPub.com</Web>
</Book>
<Book>
<AName>Steven Holzner</AName>
<BName>Using HTML</BName>
<Pub>XYZ Publication </Pub>
<Web></Web>
</Book>
</Catalog>
желаемый, правильный результат получается :
<p>
<a href="http://www.ABCPub.com">ABC Publication </a>
</p>
<p>XYZ Publication </p>
Объяснение : Соответствие шаблонам.