Xml 如何使用XPATH/XSLT检查子节点是否存在,以避免';是否不向其添加重复节点?

Xml 如何使用XPATH/XSLT检查子节点是否存在,以避免';是否不向其添加重复节点?,xml,xslt,xpath,Xml,Xslt,Xpath,如果XML源文件中已经存在重复节点,我希望消除重复节点的注入。我当前的代码正确地插入了我想要的内容,但没有检查节点是否已经存在 这是我需要处理的原始XML文件: <?xml version="1.0" encoding="UTF-8"?> <CustomObject xmlns="http://soap.sforce.com/2006/04/metadata"> <fields> <fullName>Data_Che

如果XML源文件中已经存在重复节点,我希望消除重复节点的注入。我当前的代码正确地插入了我想要的内容,但没有检查节点是否已经存在

这是我需要处理的原始XML文件:

    <?xml version="1.0" encoding="UTF-8"?>
<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
    <fields>
        <fullName>Data_Check_Comments__c</fullName>
        <description>Checking Data for Company</description>
        <label>Data Check Comments</label>
    </fields>
    <fields>
        <fullName>My_Test_Obj__c</fullName>
        <description>General info about the test object.</description>
        <inlineHelpText>This is simply a test object.</inlineHelpText>
        <label>My Test Obj</label>
    </fields>
</CustomObject>

数据检查注释
为公司检查数据
数据检查注释
我的测试对象
关于测试对象的一般信息。
这只是一个测试对象。
我的测试对象
以下是我想要的输出XML:

<?xml version="1.0" encoding="UTF-8"?>
<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
    <fields>
        <inlineHelpText>fields</inlineHelpText>
        <fullName>Data_Check_Comments__c</fullName>
        <description>Checking Data for Company</description>
        <label>Data Check Comments</label>
    </fields>
    <fields>
        <!--***I don't want this duplicate*** inlineHelpText xmlns="">fields</inlineHelpText-->
        <fullName>My_Test_Obj__c</fullName>
        <description>General info about the test object.</description>
        <inlineHelpText>This is simply a test object.</inlineHelpText>
        <label>My Test Obj</label>
    </fields>
</CustomObject>

领域
数据检查注释
为公司检查数据
数据检查注释
我的测试对象
关于测试对象的一般信息。
这只是一个测试对象。
我的测试对象
最后,这里是我当前的xlst:

<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:a="http://soap.sforce.com/2006/04/metadata">

  <xsl:template match="a:CustomObject/*">
    <xsl:copy>
      <xsl:element name="inlineHelpText">
        <xsl:value-of select="name(.)"/>
      </xsl:element>

      <xsl:call-template name="copy-children"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template name="copy-children">
    <xsl:copy-of select="./*"/>
  </xsl:template>

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

很难理解您的问题中给出了什么以及什么只是一个示例。你喜欢这个工作吗

XSLT1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:a="http://soap.sforce.com/2006/04/metadata"
exclude-result-prefixes="a">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="a:fields[not(a:inlineHelpText)]">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
        <inlineHelpText xmlns="http://soap.sforce.com/2006/04/metadata">fields</inlineHelpText>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

领域

事实上我解决了这个问题。如果问题不清楚,对不起。通过使用if和下面的语法,我可以忽略已经存在的子节点。谢谢

<xsl:if test="not(descendant::*[local-name()='inlineHelpText'])">
     <xsl:element name="inlineHelpText">
        <xsl:value-of select="name(.)"/>
     </xsl:element>
</xsl:if>


可能重复的问题请告诉我问题中不清楚的地方,我会重点修改。我现在要澄清原来的问题。@rmarq423为什么不让我知道我的答案中有什么不适合你的情况。我怀疑这能解决你的问题,因为你插入的新元素不在名称空间中。