xslt嵌套转换:无法转换

时间:2016-04-20 14:21:14

标签: xslt-1.0

我正在学习XSLT并试图在xml下面进行转换。但无法完成任务

<sample id="7">
<land1 id="8">
<owner>TOMMY</owner>
<type>INDIVIDUAL</type>
<hint>TOM_INDIVIDUAL</hint>
<date>12.02.2014</date>
<text>land details</text>
<number>1</number>
<cost>WIDERRUFLICH</cost>
</land1>
</sample> 

并尝试将上述内容转换为

<table name="sample">
<tablename="land1">
<rel name="owner" value="TOMMY"/>
<rel name="type" value="INDIVIDUAL"/>
<rel name="<hint" value="TOM_INDIVIDUAL"/>
<rel name="date" value="12.02.2014"/>
<rel name="details" value="land details"/>
<rel name="number" value="1"/>
<rel name="cost" value="25%"/>
</table>
</table>

我在下面尝试生成相同的内容,但它无效。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>



    <xsl:template match="/">
        <xsl:for-each select="*">
            <xsl:if test="current().count(*)>0">
                 <xsl:element name="table">
                     <xsl:attribute name="name">
                        <xsl:value-of select="name(.)"/>
                     </xsl:attribute>
                     <xsl:apply-templates select="/"
                </xsl:element>
            </xsl:if>

            <xsl:if test="current().count(*)=0">
                <xsl:element name="rel">
                     <xsl:attribute name="name">
                        <xsl:value-of select="name(.)"/>
                     </xsl:attribute>
                    <xsl:attribute name="value">
                        <xsl:value-of select="current()"/>
                    </xsl:attribute>

                </xsl:element>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

有人可以告诉我我在哪里做错了吗?

1 个答案:

答案 0 :(得分:0)

  

有人可以告诉我我在哪里做错了吗?

嗯,首先,current().count(*)>0不是一个有效的表达式。

你有<xsl:apply-templates select="/"没有关闭标签。这可能是一件好事 - 因为如果它起作用,它将创造一个无限循环。

我也不了解你的方法的整体逻辑。你不能简单地做:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="*[*]">
    <table name="{name()}">
        <xsl:apply-templates/>
    </table>
</xsl:template>

<xsl:template match="*">
    <rel name="{name()}" value="{.}"/>
</xsl:template>

</xsl:stylesheet>

加了:

  

具有属性的每个元素也应该是一个表。例如,   在上面的xml中,<land1 id="8">有孩子,你的逻辑有效   精细。但我的inout也可以包含<land1 id="8"/>。现在即使   它没有任何子元素,仍然是元素名称   被视为表

然后使用:

<xsl:template match="*[@*]">

而不是:

<xsl:template match="*[*]">