如何添加到元素中,如果需要,请先创建它



我需要向元素添加元素,如果元素还不存在,则首先创建它。

添加ABC和DEF后,我想要的最终结果是:

<?xml version="1.0" encoding="utf-8"?>
<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Q/>
  <B>
    <string>ABC</string>
    <string>DEF</string>
  </B>
<A>

我认为以下方法可以实现这一点:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- Identity transform -->
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>
  <!-- Insert a B element if it doesn't exist. -->
  <xsl:template match="A[not(B)]">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
        <B/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="B">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
      <string>ABC</string>
      <string>DEF</string>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

如果我从以下开始,其中<B>已经存在,它运行良好,返回上面的结果:

<?xml version="1.0" encoding="utf-8"?>
<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org
  <Q/>
  <B/>
</A>

然而,如果我没有<B>;,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org
  <Q/>
</A>

则它创建<B>如下,但不插入ABC和DEF:

<?xml version="1.0" encoding="utf-8"?>
<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org
  <Q/>
  <B/>
</A>

那么,我错过了什么?提前谢谢。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <!-- Identity transform -->
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <!-- Insert a B element with string elements if it doesn't exist. -->
    <xsl:template match="A[not(B)]">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
            <B>
                <xsl:call-template name="add-strings"/>
            </B>
        </xsl:copy>
    </xsl:template>
    <!-- Add string elements to existing B if missing -->
    <xsl:template match="B[not(string)]">
        <xsl:copy>
            <xsl:call-template name="add-strings"/>
        </xsl:copy>
    </xsl:template>
    <!-- Add string elements to caller -->
    <xsl:template name="add-strings">
        <string>ABC</string>
        <string>DEF</string>
    </xsl:template>
</xsl:stylesheet>

当B不存在时,您也必须添加B的子标签,如下所示:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
  <!-- Identity transform -->
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>
  <!-- Insert a B element if it doesn't exist. -->
  <xsl:template match="A[not(B)]">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
        <B>
           <string>ABC</string>
          <string>DEF</string>
       </B>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="B">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
      <string>ABC</string>
      <string>DEF</string>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

应用于时

<?xml version="1.0" encoding="UTF-8"?>
<root>
<A>
  <Q/>
</A>
<A>
  <Q/>
  <B/>
</A>
</root>

这就产生了

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <A>
        <Q/>
        <B>
            <string>ABC</string>
            <string>DEF</string>
        </B>
    </A>
    <A>
        <Q/>
        <B>
            <string>ABC</string>
            <string>DEF</string>
        </B>
    </A>
</root>

Empo的回答非常接近,但如果<B>已经包含<字符串>元素,新<字符串>s未添加。我做了两个小改动,解决了这个问题:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- Identity transform. -->
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>
  <!-- Insert a B element with string elements if it doesn't exist. -->
  <xsl:template match="A[not(B)]">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
      <B>
        <xsl:call-template name="add-strings"/>
      </B>
    </xsl:copy>
  </xsl:template>
  <!-- Add string elements to existing B element. -->
  <xsl:template match="B">  <!-- Whether there are <string>s or not. -->
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>  <!-- Keep existing <string>s. -->
      <xsl:call-template name="add-strings"/>
    </xsl:copy>
  </xsl:template>
  <!-- Add string elements to caller. -->
  <xsl:template name="add-strings">
    <string>ABC</string>
    <string>DEF</string>
  </xsl:template>
</xsl:stylesheet>

相关内容

  • 没有找到相关文章

最新更新