我想从XML结构中使用单个节点创建嵌套的XML节点,我尝试过但无法带来嵌套的XML结构,请一些人帮助我,我无法获得预期的行为。
XML结构:
<job[n]/> -> 0...n
<person-non-active/> -> 1
<removed> -> 1
<?xml version="1.0" encoding="UTF-8"?>
<root>
<person>
<job1/>
<job2/>
<person-non-active>
<removed>
<job3/>
<job4/>
</removed>
</person-non-active>
</person>
<person>
<bio>
<job1/>
<job2/>
<person-non-active>
<removed>
<job3/>
</removed>
</person-non-active>
</bio>
</person>
<person>
<person-non-active>
<removed>
<job3/>
<job4/>
</removed>
</person-non-active>
</person>
</root>
XSL使用:
<xsl:template match="person-non-active">
<person>
<xsl:if test="(count(../*) > 1)">
<job>
<xsl:attribute name="status"><xsl:text>active</xsl:text></xsl:attribute>
<xsl:attribute name="jobs">
<xsl:for-each select="../*">
<xsl:if test="not(name() = 'person-non-active')">
<xsl:value-of select="name()"/><xsl:text>, </xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:attribute>
</job>
</xsl:if>
<xsl:if test="(count(./removed/*) > 0)">
<job>
<xsl:attribute name="status"><xsl:text>non-acitve</xsl:text></xsl:attribute>
<xsl:attribute name="jobs">
<xsl:for-each select="./removed/*">
<xsl:value-of select="name()"/><xsl:text>, </xsl:text>
</xsl:for-each>
</xsl:attribute>
</job>
</xsl:if>
</person>
</xsl:template>
收到的输出:
<person>
<job status="active" jobs="job1, job2, "/>
<job status="non-acitve" jobs="job3, job4, "/>
</person>
预期产出
<person>
<job status="active" jobs="job1, job2, ">
<job status="non-acitve" jobs="job3, job4, "/>
</job>
</person>
<person>
<bio>
<job status="active" jobs="job1, job2, ">
<job status="non-acitve" jobs="job3, "/>
</job>
</bio>
</person>
<person>
<job status="non-acitve" jobs="job3, job4, "/>
</person>
“人员非活动”元素应用于匹配
这里有一个方法可以做到这一点。我认为缺少的只是job/@jobs中值的分隔符。
我基于这个答案编写了一些代码:如何将函数应用于XSLT中的一系列节点
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="2.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="person">
<root>
<xsl:copy>
<job>
<xsl:attribute name="status" select="'active'"/>
<xsl:variable name="seqj"><xsl:sequence select="for $j in *[starts-with(local-name(.),'job')] return local-name($j)"/></xsl:variable>
<xsl:attribute name="jobs"><xsl:value-of select="$seqj"/></xsl:attribute>
<job>
<xsl:attribute name="status" select="'non-active'"/>
<xsl:variable name="seqj"><xsl:sequence select="for $j in person-non-active/removed/*[starts-with(local-name(.),'job')] return local-name($j)"/></xsl:variable>
<xsl:attribute name="jobs"><xsl:value-of select="$seqj"/></xsl:attribute>
</job>
</job>
</xsl:copy>
</root>
</xsl:template>
</xsl:stylesheet>
你可以看到它在这里工作:https://xsltfiddle.liberty-development.net/pNmC4J3
你不能简单地做:
<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="*"/>
<xsl:template match="person">
<person>
<job status="active">
<xsl:attribute name="jobs">
<xsl:for-each select="*[not(self::person-non-active)]">
<xsl:value-of select="name()"/>
<xsl:text>, </xsl:text>
</xsl:for-each>
</xsl:attribute>
<job status="non-active">
<xsl:attribute name="jobs">
<xsl:for-each select="person-non-active/removed/*">
<xsl:value-of select="name()"/>
<xsl:text>, </xsl:text>
</xsl:for-each>
</xsl:attribute>
</job>
</job>
</person>
</xsl:template>
</xsl:stylesheet>
请注意,我已将status="non-acitve"
更改为status="non-active"
。
这要复杂得多,尤其是如果您想保留活动作业的包装器元素(例如示例中的bio),而不事先知道它们的名称。
如果作业是唯一没有子元素的元素,则可以执行以下操作:
<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>
<!-- parent of active jobs -->
<xsl:template match="*[*[not(*)]]">
<xsl:copy>
<job status="active">
<xsl:attribute name="jobs">
<xsl:for-each select="*[not(*)]">
<xsl:value-of select="name()"/>
<xsl:text>, </xsl:text>
</xsl:for-each>
</xsl:attribute>
<xsl:apply-templates select="*[*]"/>
</job>
</xsl:copy>
</xsl:template>
<!-- ancestor of non-active jobs -->
<xsl:template match="person-non-active">
<job status="non-active">
<xsl:attribute name="jobs">
<xsl:for-each select=".//*[not(*)]">
<xsl:value-of select="name()"/>
<xsl:text>, </xsl:text>
</xsl:for-each>
</xsl:attribute>
</job>
</xsl:template>
</xsl:stylesheet>
我想使用XSLT展平XML文件。示例(可以有任意数量的和节点): 输入: 期望输出: 如何仅展平那些将属性设置为的标记?
我想用XSLT转换XML文档。按名称和属性匹配的节点及其子节点应嵌套/移动到新节点中。 从转变 到 但是我的XSLT工作不好。您有什么提示吗,XSLT文件有什么问题? 非常感谢你 安德烈亚斯 我的XSLT 输出: 我的源XML文件 我希望在转换后的输出中将v:data节点及其子节点嵌套到一个新节点中。但只有属性名为“Custon”的v:data节点。转换后的XML文档应该如下所示 如果我从XSLT
我有一个XML文件: 我想使用XSLT将其转换为have: 我的文件: 但是我的输出文件中没有根节点。如何做到这一点? 还有,这是一个好的方法来进行转换吗?堆叠几个模板?
您能帮助如何用子节点分割成半节点吗? 输入: 输出: 不幸的是,我对xslt没有经验,也没有找到这样的例子。 更新后,我尝试了下面建议的方法之一,并有这个https://xsltfiddle.liberty-development.net/jyH9rNq/3节点不复制 xslt: 输出:
我很难使用下面的用例。 以下是XML: 我想要实现的是基于节点
嗨,我正在尝试在我的 https://www.graph.cool/ db 上写入带有突变的数据。我的项目是一个 React Web 应用程序,我使用 Apollo 作为 graphql 客户端和 graphql-tag npm 包作为模板文字解析器。 问题是我不知道如何使用嵌套数据为正确的突变排列 gql 模板字符串。我的架构如下所示,例如请注意,类型“公司”的字段“地址”是“地址”对象类型的数