包含来自另一个文件的 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>