xslt:检查XML文件中的元素,如果缺少预期的元素,则添加
我将收到一条如下所示的fIXML消息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 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()]) >= 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