首页 > 解决方案 > 如何使用 XSLT 在 XML 节点中添加和删除项目

问题描述

<?xml version="1.0" encoding="UTF-8"?>
<partner id="A12345">
   <classes>
      <class id="101"
            <documents>
                <document isWaived="true" name="Doc 1">true</document>
                <document isWaived="false" name="Doc 2">false</document>
            </documents>
        </class>
    </classes>
</partner>

在上面的 xml 中,我必须先删除文档节点中的所有项目,这样我才能得到以下输出。

<?xml version="1.0" encoding="UTF-8"?>
<partner id="A12345">
   <classes>
      <class id="101"
            <documents>
            </documents>
        </class>
    </classes>
</partner>

并想添加一组新文档以获得以下输出。

<?xml version="1.0" encoding="UTF-8"?>
<partner id="A12345">
   <classes>
      <class id="101"
            <documents>
                <document isWaived="false" name="Doc 3">false</document>
            </documents>
        </class>
    </classes>
</partner>

我目前使用以下 xsl 来删除文档节点中的内容。

<xsl:template match="@*|node()">
 <xsl:copy>
  <xsl:apply-templates select="@*|node()"/>
 </xsl:copy>
</xsl:template>

<xsl:template match="document" />

但这给出了这样的输出

<?xml version="1.0" encoding="UTF-8"?>
<partner id="A12345">
   <classes>
      <class id="101"
            <documents/>
        </class>
    </classes>
</partner>

现在,我必须将一些项目添加到节点数组中。我们应该怎么做。任何人都可以帮助删除节点的内容并添加新值。

标签: xmlxslt

解决方案


由于您希望输出是静态的,因此我只需更改文档模板,例如:

<xsl:template match="documents">
    <xsl:copy>
        <document isWaived="false" name="Doc 3">false</document>
    </xsl:copy>
</xsl:template>

考虑到您的评论,您正在搜索 tokenize() 函数。

<xsl:for-each select="tokenize($documentstring,';')"> <!-- the second argument is the character you want to split the string on -->
     <document isWaived="false" name="{.}"> 
         <!-- The braces allow you to run codesegments inside the attribute -->
     </document>
</xsl:for-each>     

推荐阅读