当前位置: 首页 > 知识库问答 >
问题:

使用XSLT更改XML根节点

钱瑞
2023-03-14

我是XSLT新手。我想根据其他子节点的条件更改XML中的根节点。但子节点始终保持不变。例如,我有以下XML:

   <Root1>
    ................
    ................

    <Root2>
    ................
    ................

        <AnimalOrPlant>
             <Type>A</Type>
              <Food1>Something</Food1>
              <Food2>Somthing11</Food2>
              <Name>ant</Name>
              <Color>Black</GIIN>
              <Waterconsumption>5lt</Waterconsumption>
        </AnimalOrPlant>  
    ................
    ................

    </Root2>
    ................
    ................
</Root1>

我喜欢将XML更改为:

<Root1>
    ................
    ................
    <Root2>
    ................
    ................
        <Animal>
             <Type>A</Type>
              <Food1>Something</Food1>
              <Food2>Somthing11</Food2>
              <Name>ant</Name>
              <Color>Black</Color>
              <Waterconsumption>5lt</Waterconsumption>
        </Animal>
     ................
    ................ 
    </Root2>
    ................
    ................
</Root1>

这意味着依赖于<代码>

<xsl:template match="Root1">
 <xsl:choose>
    <xsl:when test="Root2/AnimalOrPlant/Type='A'">
        <Animal>
            <xsl:element name ="Type">
              <xsl:value-of select="Root2/AnimalOrPlant/Type"/>
            </xsl:element>
            <xsl:element name ="Food1">
              <xsl:value-of select="Root2/AnimalOrPlant/Food1"/>          
            </xsl:element>
            <xsl:element name ="Food2">
              <xsl:value-of select="Root2/AnimalOrPlant/Food2"/>
            </xsl:element>
            <xsl:element name ="Name">
              <xsl:value-of select="<xsl:value-of select="Root2/AnimalOrPlant/Name"/>
            </xsl:element>
            <xsl:element name ="Color">
              <xsl:value-of select="<xsl:value-of select="Root2/AnimalOrPlant/Color"/>
            </xsl:element>
            <xsl:element name ="Waterconsumption">
              <xsl:value-of select="<xsl:value-of select="Root2/AnimalOrPlant/Waterconsumption"/>
            </xsl:element>
        </Animal>
    </xsl:when>
    <xsl:when test="Root2/AnimalOrPlant/Type='P'">
        <Plant>
            <xsl:element name ="Type">
              <xsl:value-of select="Root2/AnimalOrPlant/Type"/>
            </xsl:element>
            <xsl:element name ="Food1">
              <xsl:value-of select="Root2/AnimalOrPlant/Food1"/>          
            </xsl:element>
            <xsl:element name ="Food2">
              <xsl:value-of select="Root2/AnimalOrPlant/Food2"/>
            </xsl:element>
            <xsl:element name ="Name">
              <xsl:value-of select="<xsl:value-of select="Root2/AnimalOrPlant/Name"/>
            </xsl:element>
            <xsl:element name ="Color">
              <xsl:value-of select="<xsl:value-of select="Root2/AnimalOrPlant/Color"/>
            </xsl:element>
            <xsl:element name ="Waterconsumption">
              <xsl:value-of select="<xsl:value-of select="Root2/AnimalOrPlant/Waterconsumption"/>
            </xsl:element>
        </Plant>
    </xsl:when>
</xsl:choose>   
</xsl:template>

我不想在每个<代码>

共有2个答案

蒋培
2023-03-14

如果您了解XSLT标识模板,这很简单

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

这会复制XML中的所有现有节点,因此您只需担心要更改的节点。您只需编写模板来匹配这些模板。例如,要将带有A的TypeAnimalOrFactory元素转换为动物元素,请执行以下操作:

<xsl:template match="AnimalOrPlant[Type='A']">
    <Animal>
        <xsl:apply-templates select="@*|node()"/>
    </Animal>
</xsl:template>

试试这个XSLT

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

    <xsl:template match="AnimalOrPlant[Type='A']">
        <Animal>
            <xsl:apply-templates select="@*|node()"/>
        </Animal>
    </xsl:template>

    <xsl:template match="AnimalOrPlant[Type='P']">
        <Plant>
            <xsl:apply-templates select="@*|node()"/>
        </Plant>
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>
邵君植
2023-03-14

我建议你这样做:

XSLT 1.0

<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="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="AnimalOrPlant">
    <xsl:variable name="name">
        <xsl:choose>
            <xsl:when test="Type='A'">Animal</xsl:when>
            <xsl:when test="Type='P'">Plant</xsl:when>
            <xsl:otherwise>Unknown</xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <xsl:element name="{$name}">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

注意:这与根节点甚至根元素无关。

 类似资料:
  • 我有一个XML文件: 我想使用XSLT将其转换为have: 我的文件: 但是我的输出文件中没有根节点。如何做到这一点? 还有,这是一个好的方法来进行转换吗?堆叠几个模板?

  • 我有一个XML: 我想向根元素:/doc添加一个属性(名称空间),以便输出如下所示: 我尝试了三种xslt(跳过了默认的“复制所有”部分以减少问题的长度)。 xslt1:见下文,问题在于将空名称空间xmlns=”“添加到/doc的所有子节点(即:/doc/tag1和/doc/tag2) Xslt2:见下文,问题是“ns”被添加到根节点:和 xslt3:请参见下文,问题是报告了错误:未定义名称空间前

  • 问题内容: 这可能是一个简单的问题,尽管无法弄清楚该怎么做。我想加载和修改xml文件,然后通过php保存xml。 这是代码: 这是save_xml.php的样子: 问题答案: 这是你想要的? 你们每个人都在迭代吗 您的代码成为 希望这可以帮助 编辑 要将其发布回服务器,我会这样做: 然后在PHP文件中 该代码未经测试,可能有多种原因导致其无法正常工作,对文件的写入权限等。

  • 我正在尝试处理这个XML文件,我想根据最新的节点值删除所有匹配的节点。在以下示例中,最新节点值为“${DELETE}”,最新节点值将始终为“${DELETE}”,并且该节点将始终位于XML文件的底部。 示例: 预期产出为:

  • 我是xslt新手。 请参阅以下案例: 输入: 案例1: Xslt代码: 案例1的输出: 案例2: Xslt代码: 在情况2中,没有显示输出。我不明白为什么? 当它指向根节点Hello时。因此,在案例1中,当它执行时 这将打印整个xml。 案例2:执行时 它应该打印在下面。 有人能帮忙吗? 谢谢,Shashiraj NK

  • 我需要删除一些节点在我的xml文件中,它包含某些方法和按什么顺序出现,例如这里是输入: 如果我使用这种方法: 结果将是: 而预期产出是: 这就是秩序的运作方式。如果“停止”最后发生,那么具有相同用户标识的其他方法的任何其他节点(如暂停和运行)将被删除。但是如果不是,那么具有“停止”本身的节点和“停止”之前的所有节点将被删除。 这必须发生在相同的节id中,并且它将仅删除用户节点(保留节id,即使删除