XSLT:输出中的重复节点

时间:2018-01-31 15:59:01

标签: xml xslt transformation saxon

我正在努力进行简单的xsl转换,而且我无法找到为什么我的输出结果中有两个元素两次。这是我的代码:

XSL样式表:     

<xsl:template match="/">
    <xsl:text>[{</xsl:text> 
    <xsl:apply-templates/>
    <xsl:text>}]</xsl:text> 
</xsl:template>

<xsl:template match="Title">
    <xsl:text>{</xsl:text>        
    <xsl:value-of select="@id"/>     
    <xsl:apply-templates select="descendant::Title"/>            
    <xsl:text>}</xsl:text>    
</xsl:template>    

的xml:

<?xml version="1.0" encoding="UTF-8"?>
<Start>
    <Title id="1">
        <Title id="2">Bob</Title>
        <Age>39</Age>
        <Address>
            <Title id="3">10 Idle Lane</Title>
            <City>Yucksville</City>
            <PostalCode>xxxyyy</PostalCode>
        </Address>
    </Title>
    <Title id="4">
        <Title id="5">Bill</Title>
        <Age>39</Age>
        <Title id ="6">
            <Title id="7">10 Idle Lane</Title>
            <City>Yucksville</City>
            <PostalCode>xxxyyy</PostalCode>
            <Title id="8">10 Idle Lane</Title>
        </Title>
        <Title id="9">10 Idle Lane</Title>
    </Title>    
</Start>

输出:

[{
    {1{2}{3}}
    {4{5}{6{7}{8}}{7}{8}{9}}    
}]

我的输出中没有预料到的元素是最后一个数字:{8} {9}。我想这与后代轴选择器有关。

1 个答案:

答案 0 :(得分:1)

是的,后代轴选择器选择所有子孙等。所以你只需要将模板应用于儿童。这应该有效:

<xsl:template match="/">
    <xsl:text>[{</xsl:text>
    <xsl:apply-templates/>
    <xsl:text>}]</xsl:text>
</xsl:template>

<xsl:template match="Title">
    <xsl:text>{</xsl:text>
    <xsl:value-of select="@id"/>
    <xsl:apply-templates />
    <xsl:text>}</xsl:text>
</xsl:template>

<xsl:template match="text()" />