在 XSLT 中简单创建新元素

Simple creation of a new element in XSLT

提问人:MagicWorld 提问时间:11/14/2023 更新时间:11/14/2023 访问量:42

问:

我知道这应该很简单,但它对我来说并不奏效。 我需要翻译 XML:

<?xml version="1.0" encoding="utf-8"?>
<items>
    <element name="Name1" value="Text1"/>
    <element name="Name2" value="Text2"/>
    <element name="Name3" value="Text3"/>

</items>

到 XML:

<?xml version="1.0"?>
<goods>
    <!-- some text -->
    <Name1>Text1</Name1>
    <Name2>Text2</Name1>
    <Name3>Text3</Name1>    
</goods>

我创建了 XSLT:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" />
    <xsl:template match="/">
        <xsl:element name="goods">
            <xsl:comment>
                some text               
            </xsl:comment>      
        </xsl:element>
    </xsl:template>

    <xsl:template match="/items/element">
            <xsl:element name="{@name}">
                    <xsl:value-of select="@value"/>     
            </xsl:element>                  
    </xsl:template>

</xsl:stylesheet>

但这是错误的。我可以将模板放在其他模板上吗?还是有其他解决方案?

XML 模板 XSLT 元素

评论


答:

0赞 y.arazim 11/14/2023 #1

你可以简单地做:

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

<xsl:template match="/items"> 
    <goods> 
        <xsl:comment>some text</xsl:comment> 
        <xsl:for-each select="element">
            <xsl:element name="{@name}">
                <xsl:value-of select="@value"/>     
            </xsl:element>                  
        </xsl:for-each>
    </goods> 
</xsl:template> 

</xsl:stylesheet>

但是,仅当 中的名称是有效的 XML 元素名称时,这才有效。@name

1赞 Martin Honnen 11/14/2023 #2

您需要处理子节点,例如更改

<xsl:template match="/">
    <xsl:element name="goods">
        <xsl:comment>
            some text               
        </xsl:comment>      
    </xsl:element>
</xsl:template>

<xsl:template match="/">
    <xsl:element name="goods">
        <xsl:comment>
            some text               
        </xsl:comment>  
        <xsl:apply-templates/>    
    </xsl:element>
</xsl:template>

或者,当然,由于您不需要计算元素名称,因此最好、更轻松地使用文本结果元素goods

<xsl:template match="/">
    <goods>
        <xsl:comment>
            some text               
        </xsl:comment>  
        <xsl:apply-templates/>    
    </goods>
</xsl:template>

评论

0赞 MagicWorld 11/14/2023
非常感谢!两种选择都有帮助,但根据问题的情况,这个解决方案是最可靠的!