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

如何使用XSLT将节点位置号作为元素附加到XML中?

松阳泽
2023-03-14

我有以下需要转换的XML,如下面给出的“预期输出”部分所示。

改造的要求是:

  1. 兄弟节点(如从属节点和位置)需要附加相应的位置ID。。例如如果文件中存在多个从属节点,则节点应显示为等

示例XML输入文件

<?xml version="1.0" encoding="UTF-8"?>
<workers>
	<worker>
		<name>sam</name>
		<batch_id>1345</batch_id>
		<dependents>
			<name>sara</name>
		</dependents>
		<dependents>
			<name>tom</name>
		</dependents>
		<dependents>
			<name>harry</name>
		</dependents>
		<locations>
			<place>ny</place>
			<type>work</type>
		</locations>
		<locations>
			<place>sfo</place>
			<type>home</type>
		</locations>
	</worker>
</workers>

预期产量

<?xml version="1.0" encoding="UTF-8"?>
<workers>
	<worker>
		<name>sam</name>
		<batch_id>1345</batch_id>
		<dependents1>
			<name>sara</name>
		</dependents1>
		<dependents_row1>1</dependents_row1>
		<dependents2>
			<name>tom</name>
		</dependents2>
		<dependents_row2>2</dependents_row2>
		<dependents3>
			<name>harry</name>
		</dependents3>
		<dependents_row3>3</dependents_row3>
		<locations1>
			<place>ny</place>
			<type>work</type>
		</locations1>
		<locations_row1>1</locations_row1>
		<locations2>
			<place>sfo</place>
			<type>home</type>
		</locations2>
		<locations_row2>2</locations_row2>
	</worker>
</workers>

共有2个答案

钮轩昂
2023-03-14

一种通用的解决方案不知道元素名称,并且按照注释中的建议使用xsl:number

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs">

  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

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

  <xsl:template match="*[some $sibling in (preceding-sibling::*, following-sibling::*) satisfies node-name($sibling) = node-name(.)]">
      <xsl:variable name="index" as="xs:integer">
          <xsl:number/>
      </xsl:variable>
      <xsl:element name="{name()}{$index}">
          <xsl:apply-templates/>
      </xsl:element>
      <xsl:element name="{name()}_row{$index}">
          <xsl:value-of select="$index"/>
      </xsl:element>
  </xsl:template>

</xsl:transform>

当然,您可以减少或简化匹配="*[(前置-同级::*,后继-同级::*)中的一些$兄弟满足node-name($兄弟)=node-name(.)]"例如匹配="后代|位置"如果元素已知和/或仅针对某些元素。

http://xsltransform.hikmatu.com/6qM2e2o/2

董翰墨
2023-03-14

您可以使用以下样式表(尽管存在设计疑问):

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

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

    <xsl:template match="/workers/worker">           <!-- handles the sub-elements of the worker node -->
        <xsl:copy>
            <xsl:apply-templates select="*[not(self::dependents or self::locations)]" />   
            <xsl:apply-templates select="dependents" />   
            <xsl:apply-templates select="locations" />   
        </xsl:copy>
    </xsl:template>

    <xsl:template match="dependents|locations">      <!-- handles the addition of the position nodes -->
        <xsl:element name="{concat(local-name(),position())}">
            <xsl:copy-of select="*" />
        </xsl:element>
        <xsl:element name="{concat(local-name(),'_row',position())}">
            <xsl:value-of select="position()" />
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>
 类似资料:
  • 问题内容: 我目前正在尝试在ArrayList中每个元素的末尾附加一个分号。 代码: 最终,我将获取此电子邮件地址列表,并将其输出到“收件人”字段以使用Java发送电子邮件。因此,为什么我要在元素后面加上分号以分隔电子邮件地址。 谢谢 问题答案: 假设您使用 Java 8 ,则可以使用with as收集器来 进行 操作,该收集器 允许按输入顺序将输入元素(由指定的定界符分隔)连接起来, 如下所示:

  • 我将ExtendedXmlSerializer与C结合使用,一个已知的限制是添加对象的序列化列表。当这样做时,它会产生一个单独的元素(列表本身),其中包含列表中的项目。由于我正在反序列化来自一个单独应用程序的外部xml,我无法控制xml的布局,因此需要在用C#反序列化xml之前对其进行转换。 我在stackoverflow的其他地方找到的转换在将一种类型的元素添加到一个新的(不存在的)元素中时效果

  • 所以我有一个如下的xml文件: 并有另一个xml文件,如下所示: 使用xslt,如何将第二个文件中的两个元素添加到第一个文件中的student元素中?换句话说,如何创建如下所示的文件: 如果使用xslt是不可能的,那么使用XPath是可行的吗? 非常感谢!

  • 我是XSLT新手。我想根据其他子节点的条件更改XML中的根节点。但子节点始终保持不变。例如,我有以下XML: 我喜欢将XML更改为: 这意味着依赖于<代码> 我不想在每个<代码>

  • 我想将XML节点值(从AJAX脚本发送的XML)映射到相应的HTML表单元素中。例如,XML数据; 应通过脚本插入HTML表单: 问题在于,脚本应该通用地适用于所有对象(不能预先知道XML中会给出哪些字段,例如,如果“fieldx”是用XML发送的,则该脚本应该满足document.myform.fieldx表单元素,并具有XML中的相应值)。所以这个脚本应该循环所有XML节点,并尝试将值设置为H

  • 我正在将XML导入Access数据库。在转换过程中,数据之间的所有关系都会丢失。使用XSLT,我通过子节点将ID永久化。使用它,其中Id是添加到子节点的父元素: 我使用这种方法遇到的问题是父节点之外还有其他元素也具有元素或其变体,例如或类似的东西。当我尝试在上面的代码之外使用它时,的一些实例在以前的节点中丢失了。 很抱歉,我不知道在这里使用合适的语言,因为我对XSLT/XML不太熟悉。。。但我试图