Xslt 从同一XML文档中的名称列表重命名节点
我有以下XML:Xslt 从同一XML文档中的名称列表重命名节点,xslt,rename,nodes,Xslt,Rename,Nodes,我有以下XML: <?xml version="1.0" encoding="UTF-8"?> <Data> <Set> <Tables> <Table> <Tablehead> <C>Name</C> <C>FirstName</C> <C>Address</C> <C>Zip
<?xml version="1.0" encoding="UTF-8"?>
<Data>
<Set>
<Tables>
<Table>
<Tablehead>
<C>Name</C>
<C>FirstName</C>
<C>Address</C>
<C>Zip</C>
<C>City</C>
<C>State</C>
</Tablehead>
<Rows>
<Person>
<C>Miller</C>
<C>John</C>
<C>Squires Circle</C>
<C>88034</C>
<C>Boulder</C>
<C>Colorado</C>
</Person>
</Rows>
</Table>
</Tables>
</Set>
</Data>
名称
名字
地址
拉链
城市
陈述
米勒
约翰
乡绅圈
88034
巨石
科罗拉多州
元素person可以出现n次。现在,为了正确使用该结构,我必须首先在
中重命名
标记。
我提出了以下XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Rows">
<Rows>
<xsl:apply-templates select="Person"/>
</Rows>
</xsl:template>
<xsl:template match="Person">
<Person>
<xsl:apply-templates select="C"/>
</Person>
</xsl:template>
<xsl:template match="/Data/Set/Tables/Table/Rows/Person/C">
<xsl:variable name="nodePosition" select="position()" />
<xsl:value-of select="parent::*/parent::*/parent::*/Tablehead/C[$nodePosition]"/>
</xsl:template>
但输出总是这样:
<?xml version="1.0" encoding="UTF-8"?>
<Data>
<Set>
<Tables>
<Table>
<Tablehead>
<C>Name</C>
<C>FirstName</C>
<C>Address</C>
<C>Zip</C>
<C>City</C>
<C>State</C>
</Tablehead>
<Rows>
<Person/>
</Rows>
</Table>
</Tables>
</Set>
</Data>
名称
名字
地址
拉链
城市
陈述
它看起来不错,但我的
元素总是空的。我错过了什么?我一直在尝试,但我无法让它工作。我很高兴收到你方的任何意见。
谢谢你,并致以最良好的祝愿,
Peter以下样式表
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Person/C">
<xsl:variable name="index">
<xsl:number/>
</xsl:variable>
<xsl:element name="{../../../Tablehead/C[position() = $index]}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
当应用于输入时
<?xml version="1.0" encoding="UTF-8"?>
<Data>
<Set>
<Tables>
<Table>
<Tablehead>
<C>Name</C>
<C>FirstName</C>
<C>Address</C>
<C>Zip</C>
<C>City</C>
<C>State</C>
</Tablehead>
<Rows>
<Person>
<C>Miller</C>
<C>John</C>
<C>Squires Circle</C>
<C>88034</C>
<C>Boulder</C>
<C>Colorado</C>
</Person>
</Rows>
</Table>
</Tables>
</Set>
</Data>
名称
名字
地址
拉链
城市
陈述
米勒
约翰
乡绅圈
88034
巨石
科罗拉多州
输出
<?xml version="1.0" encoding="UTF-8"?><Data>
<Set>
<Tables>
<Table>
<Tablehead>
<C>Name</C>
<C>FirstName</C>
<C>Address</C>
<C>Zip</C>
<C>City</C>
<C>State</C>
</Tablehead>
<Rows>
<Person>
<Name>Miller</Name>
<FirstName>John</FirstName>
<Address>Squires Circle</Address>
<Zip>88034</Zip>
<City>Boulder</City>
<State>Colorado</State>
</Person>
</Rows>
</Table>
</Tables>
</Set>
</Data>
名称
名字
地址
拉链
城市
陈述
米勒
约翰
乡绅圈
88034
巨石
科罗拉多州
希望这会有所帮助。您的XML没有任何
元素,但您的XSLT代码编写时就好像它有一样。请准确解释您希望输出的样子。您好mzjn,对此表示抱歉。我现在更正了XSLT以匹配-tags。谢谢Martin,您的解决方案非常有效。很抱歉,我的XML/XSLT中的C和A不匹配。我还尝试了一个更大的文件,以及它的工作。谢谢你的帮助,看起来很容易。我会尽力去理解它。向你问好,彼得