如何使用 XSL 将 liquibase XML 转换为 CSV
Posted
技术标签:
【中文标题】如何使用 XSL 将 liquibase XML 转换为 CSV【英文标题】:How to convert liquibase XML into CSV using XSL 【发布时间】:2022-01-11 18:15:44 【问题描述】:以下是生成的 XML:
XML:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:pro="http://www.liquibase.org/xml/ns/pro"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-4.1.xsd">
<Tester author="Name" id="16384543">
<insert tableName="sampletable">
<column name="id" valueNumeric="2"/>
<column name="name" value="kathy"/>
<column name="active" valueBoolean="true"/>
<column name="age" valueNumeric="2"/>
</insert>
<insert tableName="sampletable">
<column name="id" valueNumeric="23"/>
<column name="name" value="Queen"/>
<column name="active" valueBoolean="true"/>
<column name="age" valueNumeric="29"/>
</insert>
<insert tableName="sampletable">
<column name="id" valueNumeric="25"/>
<column name="name" value="varshan"/>
<column name="active" valueBoolean="false"/>
<column name="age" valueNumeric="5"/>
</insert>
</Tester>
</databaseChangeLog>
我需要将 XML 转换为 CSV,如下所示: ID,姓名,活动,年龄 2,凯西,真,2 23,皇后,真,29 25,varshan,FALSE,5
要求:这些列属性将是动态的,并且对于不同的 XML 会有所不同。有人可以帮忙吗?
【问题讨论】:
“有人可以帮忙吗?”帮忙什么? 如前所述需要生成CSV文件... 在询问 XSLT 问题时,您需要提供 minimal reproducible example: (1) 输入 XML。 (2) 你的逻辑,以及试图实现它的 XSLT。 (3) 所需的输出,基于上面#1 中的示例 XML。 (4) XSLT 处理器及其对 XSLT 标准的遵从性:1.0、2.0 或 3.0。 这是使用的示例 XSLT: 【参考方案1】:添加到我在这里提供的答案:How to convert XML into CSV using XSL
您需要考虑命名空间。
<?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"
xmlns:dbc="http://www.liquibase.org/xml/ns/dbchangelog"
version="1.0">
<xsl:output method="text"/>
<xsl:template match="/">
<!-- Header -->
<xsl:apply-templates select="dbc:databaseChangeLog/dbc:Tester/dbc:insert[1]">
<xsl:with-param name="header">true</xsl:with-param>
</xsl:apply-templates>
<!-- Data -->
<xsl:apply-templates select="dbc:databaseChangeLog/dbc:Tester/dbc:insert"/>
</xsl:template>
<xsl:template match="dbc:insert">
<xsl:param name="header"/>
<xsl:for-each select="dbc:column">
<!-- For the header take the name attribute, else take the attribute starting with value -->
<xsl:choose>
<xsl:when test="$header='true'">
<xsl:value-of select="@name"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@*[starts-with(name(),'value')]"/>
</xsl:otherwise>
</xsl:choose>
<!-- Insert comma between values, except for last value insert new line -->
<xsl:choose>
<xsl:when test="position()=last()">
<xsl:text>
</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>,</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
在这里查看它的工作原理:https://xsltfiddle.liberty-development.net/aB9NK5
【讨论】:
转换用的罐子是什么??@sebastien @kathir43 你是什么意思? 我的意思是用于此转换的 XSL 引擎 @kathir43,网上的fiddle允许使用各种XSLT处理器,Sebastien的链接示例使用XslCompiledTransform,这是微软为.NET 2.0及更高版本的XSLT 1处理器。 感谢 @MartinHonnen 的澄清。我正在使用 eclipse 进行转换,但我无法像在线小提琴那样执行此转换。你能帮我在 Eclipse 中进行设置吗?以上是关于如何使用 XSL 将 liquibase XML 转换为 CSV的主要内容,如果未能解决你的问题,请参考以下文章
如何使用xsl根据属性将xml的兄弟节点更改为父节点和子节点
当输入 XML 和转换 XSL 是字符串时,如何使用 XslCompiledTransform。如何将转换结果作为字符串获取?