Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
xslt:检查XML文件中的元素,如果缺少预期的元素,则添加_Xml_Xslt_Osb - Fatal编程技术网

xslt:检查XML文件中的元素,如果缺少预期的元素,则添加

xslt:检查XML文件中的元素,如果缺少预期的元素,则添加,xml,xslt,osb,Xml,Xslt,Osb,我将收到一条如下所示的fIXML消息 <FIXML v="4.4" xsi:schemaLocation="../../schema/fixml-main-4-4.xsd" xmlns="http://www.fixprotocol.org/FIXML-4-4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Main attr1="19000" attr2="10"> <Hdr hattr1=

我将收到一条如下所示的fIXML消息

<FIXML v="4.4" xsi:schemaLocation="../../schema/fixml-main-4-4.xsd" xmlns="http://www.fixprotocol.org/FIXML-4-4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Main attr1="19000" attr2="10">
    <Hdr hattr1="ABC" hattr2="DEF"/>
    <Insert1 I1attr1 ="2008-08" I1attr2 ="20080810"/>
    <Insert2 I2attr1="A111C" I2attr2 ="123">
    <sub ID="1AC"/>
    </Insert2>
    <Insert2 I2attr1="A222C" I2attr2 ="456">
    <sub ID="1BC"/>
    </Insert2>
</Main>
</FIXML>

因此,我需要检查强制部分是否存在,如果不存在,则必须通过自动关闭标记来添加它们

元素检查
元素是否存在后,如果存在,保持该部分不变,如果不存在,则必须在
元素后添加
自动关闭标签,然后检查是否存在
如果存在,则将该元素保留在
之后,如果不存在,则在
之后添加

形成这样的xml

<FIXML v="4.4" xmlns="http://www.fixprotocol.org/FIXML-4-4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Main attr1="19000" attr2="10">
        <Hdr hattr1="ABC" hattr2="DEF"/>
        <Insert1/>
        <Insert2>
        <sub/>
        </Insert2>
        <Insert2>
        <sub/>
        </Insert2>
    </Main>
    </FIXML>

请建议


提前感谢。

您好,根据您使用的xslt版本,您可以通过不同的方式实现所需的功能。 我使用了XSLT1.0。 根据您的要求,我假设元素排列顺序和元素是您预先知道的

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:FIXML="fixprotocol.org/FIXML-4-4"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                exclude-result-prefixes="FIXML msxsl">

  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
  <xsl:strip-space elements="*"/>

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

  <xsl:variable name="checkData">
    <data>Hdr</data>
    <data>Insert1</data>
    <data>Insert2</data>
  </xsl:variable>

  <xsl:template match="FIXML:Main">
    <Main>
      <xsl:variable name="temp" select="//*"/>
      <xsl:for-each select="msxsl:node-set($checkData)/*">
        <xsl:choose>
          <xsl:when test="count($temp[local-name(.)=current()]) &gt;= 1">
            <xsl:copy-of select="$temp[local-name(.)=current()]"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:element name="{current()}"/>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:for-each>
    </Main>
  </xsl:template>

Hdr
插入1
插入2

变量“checkData”包含您需要检查的元素列表。唯一的另一件事是您必须使用XSLT解析器的节点集函数

您是否试图验证“Main”节点中仅存在一阶子节点?更重要的是,您的xml必须进行有效的xml到xslt转换,这不是caseHi Saurav。是的,请更正元素标记下的所有内容,好的,我正在显示元素中有许多属性(Main、Hdr等)请注意,xml必须是XSLT的有效xml。请不要在评论中发布任何代码数据。编辑您的问题部分我已将正确格式的xml文件放在主要帖子中。请推荐。谢谢。我在OSB转换中尝试了相同的XSLT文件。我得到了下面的错误。执行XSLT转换时出错:java.lang.NoSuchMethodException:对于扩展函数,找不到方法weblogic.apache.xml.dtm.ref.DTMNodeIterator.node set([ExpressionContext,])。必须在XSLT解析器中找到等效的node-set()函数。如果可以使用XSLT 2.0,则它支持node-set()(也就是说,您可以直接在变量节点上进行迭代,无需使用node-set()函数)。谢谢Eric,OSB(Oracle服务总线)只支持XSLT 1.0版本。Arf,很抱歉给您留下了这个无用的评论:-s