包含来自另一个文件的 xml 以及来自父文件的内容
Include xml from another file with contents from parent file
是否可以将另一个 xml 文件(子 xml)的内容插入具有更新属性的父 xml - 严格使用 xml 或 xslt?或者我必须使用 python 来生成 xml.
例如,假设我有一个父项 xml,其内容为:
<root>
<parent1 value="parent1">
# get contents of child.xml
</parent1>
<parent2 value="parent2">
# get contents of child.xml
</parent2>
</root>
child.xml 有内容:
<root>
<child1 value="child1"/>
<child2 value="child2"/>
</root>
我可以用 include 来做,但我也想更新这个值。所以最后我要的xml是:
<root>
<parent1 value="parent1">
<child1 value="parent1_child1"/>
<child2 value="parent1_child2"/>
</parent1>
<parent2 value="parent2">
<child1 value="parent2_child1"/>
<child2 value="parent2_child2"/>
</parent2>
</root>
其中子值是根据父值更新的。
您可以使用 document() 函数来引用另一个 XML 文件。你可以这样实现它。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml"/>
<xsl:variable name="childDoc" select="document('child.xml')"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="parent">
<xsl:variable name="currentParent" select="."/>
<xsl:copy>
<xsl:for-each select="$childDoc/root/child">
<xsl:copy>
<xsl:attribute name="value" select="concat($currentParent/@value,'_',@value)"/>
</xsl:copy>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
看到它在这里工作:https://xsltfiddle.liberty-development.net/pNvtBGr
(出于测试目的,我已将文档放入变量中。)
您可以使用 document()
函数加载“子”文档并将其分配给样式表中的变量,然后与“父”内容混合:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:variable name="child-doc" select="document('child.xml')"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/root/*">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates select="$child-doc/root/*" mode="child">
<xsl:with-param name="prefix" tunnel="yes" select="@value"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()" mode="child">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="child"/>
</xsl:copy>
</xsl:template>
<xsl:template match="root/*/@value" mode="child">
<xsl:param name="prefix" tunnel="yes"/>
<xsl:attribute name="value" select="string-join(($prefix, .), '_')"/>
</xsl:template>
</xsl:stylesheet>
是否可以将另一个 xml 文件(子 xml)的内容插入具有更新属性的父 xml - 严格使用 xml 或 xslt?或者我必须使用 python 来生成 xml.
例如,假设我有一个父项 xml,其内容为:
<root>
<parent1 value="parent1">
# get contents of child.xml
</parent1>
<parent2 value="parent2">
# get contents of child.xml
</parent2>
</root>
child.xml 有内容:
<root>
<child1 value="child1"/>
<child2 value="child2"/>
</root>
我可以用 include 来做,但我也想更新这个值。所以最后我要的xml是:
<root>
<parent1 value="parent1">
<child1 value="parent1_child1"/>
<child2 value="parent1_child2"/>
</parent1>
<parent2 value="parent2">
<child1 value="parent2_child1"/>
<child2 value="parent2_child2"/>
</parent2>
</root>
其中子值是根据父值更新的。
您可以使用 document() 函数来引用另一个 XML 文件。你可以这样实现它。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml"/>
<xsl:variable name="childDoc" select="document('child.xml')"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="parent">
<xsl:variable name="currentParent" select="."/>
<xsl:copy>
<xsl:for-each select="$childDoc/root/child">
<xsl:copy>
<xsl:attribute name="value" select="concat($currentParent/@value,'_',@value)"/>
</xsl:copy>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
看到它在这里工作:https://xsltfiddle.liberty-development.net/pNvtBGr (出于测试目的,我已将文档放入变量中。)
您可以使用 document()
函数加载“子”文档并将其分配给样式表中的变量,然后与“父”内容混合:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:variable name="child-doc" select="document('child.xml')"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/root/*">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates select="$child-doc/root/*" mode="child">
<xsl:with-param name="prefix" tunnel="yes" select="@value"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()" mode="child">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="child"/>
</xsl:copy>
</xsl:template>
<xsl:template match="root/*/@value" mode="child">
<xsl:param name="prefix" tunnel="yes"/>
<xsl:attribute name="value" select="string-join(($prefix, .), '_')"/>
</xsl:template>
</xsl:stylesheet>