【问题标题】:How to convert XML using XSLT and copy nodes along with attributes如何使用 XSLT 转换 XML 并复制节点和属性
【发布时间】:2015-07-31 15:34:39
【问题描述】:

我有一个以下 XML 应该转换为“预期输出”(如下所述。但我不确定为什么节点属性 (ABC) 不是在 xml 标记内部而是在外部。

<?xml version="1.0" encoding="UTF-8"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Node ID="ABC">
<Name>Name-ABC</Name>
<Description>Desc-ABC</Description>
</Node>
</Root>

XSL:

<?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="Node">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

电流输出

<?xml version="1.0" encoding="UTF-8"?>
<Node xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">ABC
Name-ABC
Desc-ABC
</Node>

预期输出(属性应该在里面),我也不需要复制任何与我创建的模板不匹配的节点:

<?xml version="1.0" encoding="UTF-8"?>
<Node xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ID="ABC"></Node>

【问题讨论】:

    标签: xslt


    【解决方案1】:

    如果要复制Node 元素的属性,请添加模板&lt;xsl:template match="Node/@*"&gt;&lt;xsl:copy/&gt;&lt;/xsl:template&gt; 或确保在Node 元素的模板中使用&lt;xsl:copy-of select="@*"/&gt; 复制它们。目前尚不清楚您想对子元素做什么,如果您根本不想复制或输出它们,请删除模板内的 &lt;xsl:apply-templates select="node()"/&gt;

    如果您只知道要复制到输出的元素的名称,请使用样式表开始

    <xsl:template match="/">
      <xsl:apply-templates select="//Node"/>
    </xsl:template>
    

    然后使用已经提出的建议,即

    <xsl:template match="Node/@*"><xsl:copy/></xsl:template>
    

    <xsl:template match="Node"> <xsl:copy> <xsl:apply-templates select="@*" /> </xsl:copy> </xsl:template>
    

    或者作为这两个模板的替代方案,您可以使用单个模板来执行 Node 操作

    <xsl:template match="Node">
      <xsl:copy>
        <xsl:copy-of select="@*"/>
      </xsl:copy>
    </xsl:template>
    

    【讨论】:

    • 好的 尝试了你的建议。看起来像这样 w3.org/1999/XSL/Transform"> 输出是 w3.org/2001/XMLSchema-instance"> 不包括属性
    • 我建议添加一个匹配模板Node/@*的模板。您尚未添加模板,但更改了现有模板的匹配模式和内容。
    • ok,试过了,输出如预期的那样 w3.org/1999/XSL/Transform"> 但现在我唯一的问题是额外的标签信息也会被填充。例如,如果有另一个 node1,那么 XSL 将失败 :(
    • 假设这是 xml: w3.org/2001/XMLSchema-instance"> 123 2015-05-11AATest测试
    • 如果您不希望 Node1 产生任何输出,请添加模板 &lt;xsl:template match="Node1"/&gt;
    猜你喜欢
    • 2019-09-26
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 2022-01-26
    • 2018-10-12
    相关资源
    最近更新 更多