рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЯреЗрдореНрдкрд▓реЗрдЯ рдЬреЛ рдПрдХреНрд╕рдПрд╕рдПрд▓рдЯреА рдХреЛ рдереЛрдбрд╝рд╛ рдПрдХреНрд╕рдЯреНрд░реИрдХреНрдЯ рдХреЗ рд╕рд╛рде рдирд┐рдпрдорд┐рдд рдПрдХреНрд╕рдПрд╕рдПрд▓рдЯреА рдореЗрдВ рдорд┐рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд┐рд╡рд░рдг рдХреЗ рдмрдЬрд╛рдп, рдореИрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдирдП рдбрд┐рдЬрд╛рдЗрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
<px:each="item" x:if-attr="position() mod 2" x:attr-class="'odd'" xmlns:x="xslt-sugar"> <span class="date" x:value="date"/> <xsl:value-of select="title"/> <x:block x:if="description" x:value="concat(' ', description)" x:doe="yes"/> </p>
рдЗрд╕ рдХреЛрдб рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп XSLT рдорд┐рд▓рддрд╛ рд╣реИ:
<xsl:for-each select="item"> <p> <xsl:if test="position() mod 2"> <xsl:attribute name="class"><xsl:value-of select="'odd'"/></xsl:attribute> </xsl:if> <span class="date"><xsl:value-of select="date"/></span> <xsl:value-of select="title"/> <xsl:if test="description"> <xsl:value-of select="concat(' ', description)" disable-output-escaping="yes"/> </xsl:if> </p> </xsl:for-each>
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреИрд░рд╛рдореАрдЯрд░
x:attr-name="val"
<xsl:value-of select="val"/>
рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ xslsugar.xslt рдЯреЗрдореНрдкрд▓реЗрдЯ <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:x="xslt-sugar" version="1.0"> <xsl:output method="xml" indent="yes" encoding="utf-8"/> <xsl:template match="*|@*|text()|processing-instruction()|comment()"> <xsl:copy> <xsl:apply-templates select="*|@*|text()|processing-instruction()|comment()"/> </xsl:copy> </xsl:template> <xsl:template match="x:*|@x:*"/> <xsl:template match="x:block"> <xsl:apply-templates select="*|@*|text()|processing-instruction()|comment()"/> </xsl:template> <xsl:template match="@x:value"> <xsl:element name="xsl:value-of" namespace="http://www.w3.org/1999/XSL/Transform"> <xsl:attribute name="select"><xsl:value-of select="."/></xsl:attribute> <xsl:if test="../@x:doe"><xsl:attribute name="disable-output-escaping"><xsl:value-of select="../@x:doe"/></xsl:attribute></xsl:if> </xsl:element> </xsl:template> <xsl:template match="*[@x:if]"> <xsl:element name="xsl:if" namespace="http://www.w3.org/1999/XSL/Transform"> <xsl:attribute name="test"><xsl:value-of select="@x:if"/></xsl:attribute> <xsl:apply-templates select="." mode="element"/> </xsl:element> </xsl:template> <xsl:template match="*[@x:each]"> <xsl:element name="xsl:for-each" namespace="http://www.w3.org/1999/XSL/Transform"> <xsl:attribute name="select"><xsl:value-of select="@x:each"/></xsl:attribute> <xsl:apply-templates select="." mode="element"/> </xsl:element> </xsl:template> <xsl:template match="@x:if-attr"> <xsl:element name="xsl:if" namespace="http://www.w3.org/1999/XSL/Transform"> <xsl:attribute name="test"><xsl:value-of select="."/></xsl:attribute> <xsl:for-each select="../@x:*[starts-with(local-name(), 'attr-')]"> <xsl:element name="xsl:attribute" namespace="http://www.w3.org/1999/XSL/Transform"> <xsl:attribute name="name"><xsl:value-of select="substring(local-name(), 6)"/></xsl:attribute> <xsl:element name="xsl:value-of" namespace="http://www.w3.org/1999/XSL/Transform"> <xsl:attribute name="select"><xsl:value-of select="."/></xsl:attribute> </xsl:element> </xsl:element> </xsl:for-each> </xsl:element> </xsl:template> <xsl:template match="*" mode="element"> <xsl:copy> <xsl:apply-templates select="*|@*|text()|processing-instruction()|comment()"/> </xsl:copy> </xsl:template> <xsl:template match="x:block" mode="element"> <xsl:apply-templates select="*|@*|text()|processing-instruction()|comment()"/> </xsl:template> </xsl:stylesheet>
рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ рдФрд░ рдЕрд╡рд╕рд░реЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдЦреБрдж рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдХрд░реЗрдВ, рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдЪрд╛рд░ рд╣реИред
рдкреБрдирд╢реНрдЪ: рдЕрдкрдиреЗ рдЪреАрдиреА XSLT рдХрдиреНрд╡рд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ:
рд╡рд┐рдВрдбреЛрдЬ рдкрд░, рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
msxsl.exe -o template.xslt template.xslt xslsugar.xslt
(рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА)
PPS: рдпрджрд┐ рдЖрдк рдореМрдЬреВрджрд╛ xmlns рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ: xsl, рдЬреЛ рдХрд┐ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рддреЛ
xmlns:x="xslt-sugar"
рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
xmlns:x="xslt-sugar"
рдирд╛рдо рд╕реНрдерд╛рди xslsugar.xslt рдореЗрдВ
xmlns:x="http://www.w3.org/1999/XSL/Transform"
рдФрд░
x:*
рд╣рдЯрд╛ рджреЗрдВ
x:*
рдЦрд╛рд▓реА рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ:
<xsl:template match="@x:*"/>
, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЖрдк рдЕрддрд┐рд░рд┐рдХреНрдд рдирд╛рдо рд╕реНрдерд╛рди рдХреЗ рдмрд┐рдирд╛ рд▓рд┐рдЦ тАЛтАЛрд╕рдХрддреЗ рд╣реИрдВ:
<p xsl:each="item">
рдЕрдЧрд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг, рдФрд░ рдЖрдЧреЗ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП,
code.google.com/p/xslt-sugar рджреЗрдЦреЗрдВ