我有一个由名称、类型和数字元素组成的实体。不幸的是,它以我不想要的格式呈现。不允许修改呈现该实体的代码。我唯一可以做的是创建一个 XSL 文件,将我的输入转换为所需的输出。
假设我们有 3 个实体。XML 文件以错误的模式显示它们。它显示第一个实体的名称、第二个实体的名称,然后显示第三个实体的名称。相同的模式适用于类型和数字。它显示第一个实体的类型、第二个实体的类型、第三个实体的类型等。
我想以更合乎逻辑的模式输出实体,例如第一个实体的名称、第一个实体的类型、第一个实体的数字。后跟第二个实体的名称、第二个实体的类型、第二个实体的编号等。我还想将这些元素中的每一个放入一个名为Entity的元素中。
那么,例如,我将如何转换以下 XML 输入
<root>
<Name>Harambe</Name>
<Name>John Smith</Name>
<Name>Mazda</Name>
<Type>Ape</Type>
<Type>Human</Type>
<Type>Car</Type>
<Number>1111</Number>
<Number>2222</Number>
<Number>3333</Number>
</root>
进入这个:
<root>
<Entity>
<Name>Harambe</Name>
<Type>Ape</Type>
<Number>1111</Number>
</Entity>
<Entity>
<Name>John Smith</Name>
<Type>Human</Type>
<Number>2222</Number>
</Entity>
<Entity>
<Name>Mazda</Name>
<Type>Car</Type>
<Number>3333</Number>
</Entity>
</root>
你为什么不简单地做:
XSLT 1.0
<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:template match="/root">
<xsl:copy>
<xsl:for-each select="Name">
<xsl:variable name="i" select="position()" />
<Entity>
<xsl:copy-of select=". | following-sibling::Type[$i] | following-sibling::Number[$i]"/>
</Entity>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>