Viewing file: at_20000618.py (4.16 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
#Based on Andy Turk's RTF FAQ (18 June 2000). Interesting because of the fact that his RTF consists of a grove of attributes. Note that his xsl:value-ofs had to be changed to xsl:copy-ofs from Ft.Xml.Xslt import XsltException, Error from Xml.Xslt import test_harness
#This one should bomb: implicit conversion from RTF to node-set sheet_1 = """<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" > <xsl:strip-space elements="*"/>
<xsl:template match="row"> <xsl:variable name="attrs"><xsl:copy-of select="@*"/></xsl:variable> <tr> <xsl:for-each select="../column"> <td> <xsl:for-each select="@*"> <xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute> </xsl:for-each> <xsl:for-each select="$attrs"> <xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute> </xsl:for-each> </td> </xsl:for-each> </tr> </xsl:template> <xsl:template match='/'> <docelem> <xsl:apply-templates select='*'/> </docelem> </xsl:template>
</xsl:stylesheet>"""
#Do it the right way sheet_2 = """<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" > <xsl:strip-space elements="*"/>
<xsl:template match="row"> <xsl:variable name="attrs" select="@*"/> <tr> <xsl:for-each select="../column"> <td> <xsl:for-each select="@*"> <xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute> </xsl:for-each> <xsl:for-each select="$attrs"> <xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute> </xsl:for-each> </td> </xsl:for-each> </tr> </xsl:template> <xsl:template match='/'> <docelem><xsl:apply-templates select='*'/></docelem> </xsl:template>
</xsl:stylesheet>"""
#Do it by using the node-set extension sheet_3 = """<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" exclude-result-prefixes="exsl" version="1.0" > <xsl:strip-space elements="*"/>
<xsl:template match="row"> <xsl:variable name="attrs"><xsl:copy-of select="@*"/></xsl:variable> <tr> <xsl:for-each select="../column"> <td> <xsl:for-each select="@*"> <xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute> </xsl:for-each> <!-- $attrs should be just an RTF document node at this point. We expect the for-each here to select an empty node-set. --> <xsl:for-each select="exsl:node-set($attrs)/@*"> <xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute> </xsl:for-each> </td> </xsl:for-each> </tr> </xsl:template> <xsl:template match='/'> <docelem> <xsl:apply-templates select='*'/> </docelem> </xsl:template>
</xsl:stylesheet>"""
xml_source="""<matrix> <column c="1"/> <column c="2"/> <row r="1"/> <row r="2"/> </matrix> """
expected_2 = """<?xml version='1.0' encoding='UTF-8'?> <docelem><tr><td r='1' c='1'/><td r='1' c='2'/></tr><tr><td r='2' c='1'/><td r='2' c='2'/></tr></docelem> """
# RTFs cannot contain attribute/namespace nodes as # immediate children expected_3 = """<?xml version='1.0' encoding='UTF-8'?> <docelem><tr><td c='1'/><td c='2'/></tr><tr><td c='1'/><td c='2'/></tr></docelem> """
def Test(tester):
source = test_harness.FileInfo(string=xml_source) sheet = test_harness.FileInfo(string=sheet_1) test_harness.XsltTest(tester, source, [sheet], "", exceptionCode=Error.INVALID_FOREACH_SELECT, title='Invalid use of RTF')
source = test_harness.FileInfo(string=xml_source) sheet = test_harness.FileInfo(string=sheet_2) test_harness.XsltTest(tester, source, [sheet], expected_2, title="RTF as variable")
source = test_harness.FileInfo(string=xml_source) sheet = test_harness.FileInfo(string=sheet_3) test_harness.XsltTest(tester, source, [sheet], expected_3, title="Conversion with exsl:node-set") return
|