【发布时间】:2022-01-13 17:14:15
【问题描述】:
寻找一种基于预定义值使用 xlst 转换 xml 的方法
我对 xslt 很陌生,如果这是一个基本问题,请原谅我。
输入xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<project groups="mygroup" name="test1/project1" path="current_dir" />
<project groups="mygroup" name="test2/project2" path="some_dir/foo"/>
<project groups="mygroup" name="test3/project3" path="new_dir/bar"/>
<project groups="mygroup" name="test4/project4" path="current_dir/baz"/>
</manifest>
寻找输出
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<project groups="mygroup" name="test1/project1" path="myfolder" />
<project groups="mygroup" name="test2/project2" path="myfolder/step1"/>
<project groups="mygroup" name="test3/project3" path="test_folder/>
</manifest>
基本上,将路径更改为预定义的自定义路径,并排除没有自定义路径的行。
if name="test1/project1" change path="myfolder"
if name="test2/project2" change path="myfolder/step1"
if name="test3/project3" change path="test_folder"
删除其他所有内容
我从下面的代码开始,但这一个修改了相同的路径(考虑到没有条件检查)。 我想添加条件来检查“名称”属性,并将“路径”属性更改为相应的路径,并删除不需要自定义路径的内容。比如上面例子中的test4/project4
<?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" indent="yes" encoding="utf-8"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/manifest/project/@path">
<xsl:attribute name="path">Custom Path</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
【问题讨论】:
-
在询问 XSLT 问题时,您需要提供 minimal reproducible example: (1) 输入 XML。 (2) 你的逻辑,以及试图实现它的 XSLT。 (3) 所需的输出,基于上面#1 中的示例 XML。 (4) XSLT 处理器及其对 XSLT 标准的遵从性:1.0、2.0 或 3.0。
-
请编辑您的问题并添加样式表在修改
path属性值时应遵循的确切规则。 -
@yitzhak-khabinsky 我坚持匹配确切的属性,如果我有更多关于改进示例的想法,进一步检查会更新问题。
-
我正在使用 xsltproc 工具进行转换,我认为任何 XSLT 标准都可以工作。
-
@michael.hor257k 添加了一些编辑,是否解决了您的评论?