是否可以从子节点复制数据并将其传递给父节点并使用 XSLT 处理删除子节点
Is it possible to copy data from child nodes and pass it to parent node and procced to delete the child nodes using XSLT
我正在尝试消除子节点并将它们的数据复制到父节点。
例如,
<?xml version="1.0" encoding="utf-8"?>
<root>
<data>
<School>
<Name>
<Data>
<FirstName>DonaldDuck</FirstName>
</Data>
</Name>
</School>
</data>
</root>
期望的输出是
<?xml version="1.0" encoding="utf-8"?>
<root>
<data>
<School>
<Name>DonaldDuck</Name>
</School>
</data>
</root>
我试过使用下面的代码,但它没有按预期工作
<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:strip-space elements="*"/>
<xsl:template match="root/data">
<xsl:copy>
<xsl:apply-templates select="school"/>
</xsl:copy>
</xsl:template>
<xsl:template match="school">
<xsl:copy>
<xsl:copy-of select="*/*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
非常感谢任何帮助。
您可以通过将 身份模板 与简单的替换模板相结合来实现您的目标:
<?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"/>
<!-- identity template -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="Name">
<xsl:copy>
<xsl:value-of select="Data/FirstName" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
这会将所有 Name
元素的值替换为其 Data/FirstName
child 的值。如果您想替换 child 的任何 child,您应该改用 */*
轴 - 正如您在示例中所做的那样。
在这两种情况下,它的输出都是:
<?xml version="1.0"?>
<root>
<data>
<School>
<Name>DonaldDuck</Name>
</School>
</data>
</root>
我正在尝试消除子节点并将它们的数据复制到父节点。 例如,
<?xml version="1.0" encoding="utf-8"?>
<root>
<data>
<School>
<Name>
<Data>
<FirstName>DonaldDuck</FirstName>
</Data>
</Name>
</School>
</data>
</root>
期望的输出是
<?xml version="1.0" encoding="utf-8"?>
<root>
<data>
<School>
<Name>DonaldDuck</Name>
</School>
</data>
</root>
我试过使用下面的代码,但它没有按预期工作
<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:strip-space elements="*"/>
<xsl:template match="root/data">
<xsl:copy>
<xsl:apply-templates select="school"/>
</xsl:copy>
</xsl:template>
<xsl:template match="school">
<xsl:copy>
<xsl:copy-of select="*/*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
非常感谢任何帮助。
您可以通过将 身份模板 与简单的替换模板相结合来实现您的目标:
<?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"/>
<!-- identity template -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="Name">
<xsl:copy>
<xsl:value-of select="Data/FirstName" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
这会将所有 Name
元素的值替换为其 Data/FirstName
child 的值。如果您想替换 child 的任何 child,您应该改用 */*
轴 - 正如您在示例中所做的那样。
在这两种情况下,它的输出都是:
<?xml version="1.0"?>
<root>
<data>
<School>
<Name>DonaldDuck</Name>
</School>
</data>
</root>