【发布时间】:2021-02-16 18:06:41
【问题描述】:
我正在尝试自动使用 XSLT 展平任何 XML 文件。它可以实现吗?我猜是这样,但我找不到办法。
输入示例
<person>
<name>
<first>John</first>
<last>Doe</last>
</name>
<data>
<address>
<street>Main</street>
<city>Los Angeles</city>
</address>
</data>
</person>
预期输出
<person>
<name_first>John</name_first>
<name_last>Doe</name_last>
<data_address_street>Main</data_address_street>
<data_address_city>Los Angeles</data_address_city>
</person>
我尝试了很多东西,但我得到的更接近的是从this answer 中提取的。
<?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="xs" version="2.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*/*">
<xsl:for-each select="*">
<xsl:element name="{concat(name(..),'_',name())}">
<xsl:apply-templates select="node()"/>
</xsl:element>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
作为@Michael Kay cmets,一个例子并不构成规范。所以我想指出任何 cmets、处理指令、混合内容以及示例中没有的所有内容都应该被忽略。
【问题讨论】:
-
一个示例不构成规范:您说“任何 XML”,但这意味着您需要指定属性、cmets、处理指令和混合内容会发生什么。
-
感谢您的评论。你是对的。我编辑了我的问题并试图解释任何 cmets、处理指令等都应该被忽略。事实是我试图让问题简短。任何其他改进它的 cmet 都会受到欢迎。