我是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>
我不想在每个<代码>
如果您了解XSLT标识模板,这很简单
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
这会复制XML中的所有现有节点,因此您只需担心要更改的节点。您只需编写模板来匹配这些模板。例如,要将带有A的Type
的AnimalOrFactory
元素转换为动物
元素,请执行以下操作:
<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>
我建议你这样做:
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文件的底部。 示例: 预期产出为:
我需要删除一些节点在我的xml文件中,它包含某些方法和按什么顺序出现,例如这里是输入: 如果我使用这种方法: 结果将是: 而预期产出是: 这就是秩序的运作方式。如果“停止”最后发生,那么具有相同用户标识的其他方法的任何其他节点(如暂停和运行)将被删除。但是如果不是,那么具有“停止”本身的节点和“停止”之前的所有节点将被删除。 这必须发生在相同的节id中,并且它将仅删除用户节点(保留节id,即使删除
我是xslt新手。 请参阅以下案例: 输入: 案例1: Xslt代码: 案例1的输出: 案例2: Xslt代码: 在情况2中,没有显示输出。我不明白为什么? 当它指向根节点Hello时。因此,在案例1中,当它执行时 这将打印整个xml。 案例2:执行时 它应该打印在下面。 有人能帮忙吗? 谢谢,Shashiraj NK