在XSL中匹配属性值后提取值

时间:2013-06-24 17:04:13

标签: xml xslt

我有以下 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
 <response>
<result name="response" numFound="10000" start="0">
    <doc>
        <str name="Title">Title 1</str>
        <str name="GUID">IMG_1</str>
        <str name="Desc">Desc 1</str>
    </doc>
    <doc>
        <str name="Title">Title 2</str>
        <str name="GUID">IMG_2</str>
        <str name="Desc">Desc 2</str>
    </doc>
</result>
</response>

我想将其转换为以下 HTML 文件:

<html>
<head> </head>
<body>
    <table border="1">
        <tr>
            <td colspan="2">
                {Title}
            </td>
        </tr>
        <tr>
            <td>
                <img src="http://myserver/images/{GUID}">
            </td>
            <td>
                {Desc}
            </td>
        </tr>
        <tr>
            <td colspan="2">
                {Title}
            </td>
        </tr>
        <tr>
            <td>
                <img src="http://myserver/images/{GUID}">
            </td>
            <td>
                {Desc}
            </td>
        </tr>
    </table>
</body>
  </html>

应从 XML 文件中替换{}中的内容。我很好奇如何使用 XSL 来做到这一点。我的尝试如下,但它出现 空白 ,即我得到结构,但没有标题或的说明即可。

<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' >
<xsl:output media-type="text/html; charset=UTF-8" encoding="UTF-8"/>

<xsl:template match='/'>
    <html>
        <head> </head>
        <body>
            <table border="1">
                <xsl:apply-templates select="response/result/doc"/>
            </table>
        </body>
    </html>
</xsl:template>

<xsl:template match="doc">
    <xsl:variable name="title" select="doc/str[@name='Title']"/>
    <xsl:variable name="guid" select="doc/str[@name='GUID']"/>
    <xsl:variable name="desc" select="doc/str[@name='Desc']"/>
    <tr>
        <td colspan="2">
            <xsl:value-of select="$title"/>
        </td>
    </tr>
    <tr>
        <td>
            <img src="http://myserver/images/{GUID}" />
        </td>
        <td>
            <xsl:value-of select="$desc"/>
        </td>
    </tr>
</xsl:template>
 </xsl:stylesheet>

我很感激任何帮助,因为我是新手。

2 个答案:

答案 0 :(得分:1)

xlst中只有一些小错误。 由于当前用于选择模板doc中变量的节点是doc元素,因此您必须删除doc/

<xsl:variable name="title" select="str[@name='Title']"/>
<xsl:variable name="guid" select="str[@name='GUID']"/>
<xsl:variable name="desc" select="str[@name='Desc']"/>

要将变量值添加到链接,请使用:

<img src="http://myserver/images/{$guid}" />

因此请尝试:

<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' >
    <xsl:output media-type="text/html; charset=UTF-8" encoding="UTF-8"/>

    <xsl:template match='/'>
        <html>
            <head> </head>
            <body>
                <table border="1">
                    <xsl:apply-templates select="response/result/doc"/>
                </table>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="doc">
        <xsl:variable name="title" select="str[@name='Title']"/>
        <xsl:variable name="guid" select="str[@name='GUID']"/>
        <xsl:variable name="desc" select="str[@name='Desc']"/>
        <tr>
            <td colspan="2">
                <xsl:value-of select="$title"/>
            </td>
        </tr>
        <tr>
            <td>
                <img src="http://myserver/images/{$guid}" />
            </td>
            <td>
                <xsl:value-of select="$desc"/>
            </td>
        </tr>
    </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:1)

你几乎就在那里,你刚添加了一个额外的“doc /”

因为你正在使用

<xsl:template match="doc">

一切都与doc相关,所以你应该只

<xsl:variable name="title" select="str[@name='Title']"/>
<xsl:variable name="guid" select="str[@name='GUID']"/>
<xsl:variable name="desc" select="str[@name='Desc']"/>