XSLT将HTML转换为XML

时间:2016-10-14 05:30:29

标签: xml xslt

我正在尝试转换以下HTML代码,但是在获取所需的值和使用XSLT的子字符串函数时遇到问题。这是我正在尝试转换的HTML代码的一部分:

<th scope="row">2005DEC</th>
<td>2,757</td>

以下XML代码:

<?xml version="1.0"?>
<Original>
    <Entry>
        <Year>2005</Year>
        <Month>DEC</Month>
        <Age>
            <Group>
                <value>90</value>
            </Group>
        </Age>
    </Entry>
</Original>

我正在尝试运行XSLT查询,但它一直出错。我的XSLT是:

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

    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
    <Original>
        <xsl:for-each select="@scope=row">
            <Entry>
                <Year>
                    <xsl:value-of select="substring(@scope=row, 1, 4)"/>
                </Year>
                <Month>
                    <xsl:value-of select="substring(@scope=row, 5, 3)"/>
                </Month>
                <Age>

                <Group>

                    <value>
                        <xsl:value-of select="td[1]"/>
                    </value>
                </Group>

                </Age>
            </Entry>
        </xsl:for-each>
    </Original>
    </xsl:template>


</xsl:stylesheet>

错误是:

Ivans-MacBook-Pro:xslt-test ivanteong$ java -jar saxon9he.jar table823.html table823.xslt > out.xml
Error at xsl:value-of on line 13 column 73 of table823.xslt:
  XPTY0004: Required item type of first argument of substring() is xs:string; supplied value
  has item type xs:boolean
Error at xsl:value-of on line 16 column 73 of table823.xslt:
  XPTY0004: Required item type of first argument of substring() is xs:string; supplied value
  has item type xs:boolean
Failed to compile stylesheet. 2 errors detected.

2 个答案:

答案 0 :(得分:2)

好吧,用表达式

<xsl:value-of select="substring(@scope=row, 5, 3)"/>

很明显,我希望,为什么你会收到错误信息

Required item type of first argument of substring() is xs:string; supplied value has item type xs:boolean

我们不知道您的完整输入树是什么,但请为初学者尝试:

                                                                                                                                                         

            <Group>

                <value>
                    <xsl:value-of select="following-sibling::td[1]"/>
                </value>
            </Group>

            </Age>
        </Entry>
    </xsl:for-each>
</Original>
</xsl:template>

答案 1 :(得分:1)

如果不知道上下文是什么,很难提供建议。我猜你想做:

<xsl:value-of select="substring(th[@scope='row'], 1, 4)"/>

如果当前上下文是th元素的父节点,则此方法将起作用。

请注意:

<xsl:for-each select="@scope=row">

也是无效的语法 - 但我不知道如何修复它而不了解XML的结构。