简体   繁体   English

XSLT无法转换消息

[英]XSLT failed to transform message

Hello i am having problem with xslt i am working with. 您好,我正在使用xslt遇到问题。 I am trying to transform message with following stylesheet: 我正在尝试使用以下样式表转换消息:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" >
    <xsl:param name="ename">Test</xsl:param>
    <xsl:param name="evalue">Test1234</xsl:param>

    <xsl:param name="removeElementsNamed" select="'Test'"/>
    <!-- <xsl:param name="numberGenerated" select="following-sibling::metadata/metadata-element[key='sequence_no']"/> -->
    <xsl:param name="numberGenerated" select="following-sibling::metadata[metadata-element/key='messageuniqueid'][2]"/>
    <xsl:param name="id" select="0004"/>

    <xsl:output method="xml" encoding="utf-8"/>
    <xsl:template match="@*|node()" name="input">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>     
    <xsl:template match="Root">
        <xsl:copy>
            <xsl:apply-templates/>
                <xsl:if test="not(c)">
                    <xsl:element name="{$ename}"><xsl:value-of select="$evalue"/></xsl:element>
                </xsl:if> 
                <xsl:if test="Record/Composite/Field/@id = $id">
                    <xsl:value-of select="$numberGenerated"/>>
                </xsl:if> 
        </xsl:copy>
    </xsl:template>
    <xsl:template match="Root">
        <xsl:if test="not(name() = $removeElementsNamed)">
            <xsl:call-template name="input"/>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

The following is my input message 以下是我的输入信息

<Message>
  <payload>
    <Root id="ORDERS">
      <Record id="UNB">
        <Composite id="S001">
          <Field id="0001">UNOA</Field>
          <Field id="0002">2</Field>
        </Composite>
        <Composite id="S002">
          <Field id="0004">8712423008458</Field>
          <Field id="0007">14</Field>
          <Field id="0008">VALKSOFTWARE</Field>
        </Composite>
        <Composite id="S003">
          <Field id="0007">14</Field>
          <Field id="0014">03</Field>
        </Composite>
        <Composite id="S004">
          <Field id="0017">20070123</Field>
          <Field id="0019">1420</Field>
        </Composite>
        <Field id="0020">87096</Field>
      </Record>
    </Root>
  </payload>
    <metadata>
        <metadata-element>
            <key>messageuniqueid</key>  
            <value>unique-id</value>
        </metadata-element>
    </metadata>
    <metadata>
        <metadata-element>
            <key>sequence_no</key>  
            <value>0123456789</value>
        </metadata-element>
    </metadata>
</Message>

What i want to achieve is basically get the value of metadata element ( sequence_no ) which in this case is "0123456789" and i want to paste this value in place of "id=0004" so at the end it will show "id=0123456789" 我要实现的基本上是获取元数据元素(sequence_no)的值,在这种情况下为“ 0123456789”,我想将此值粘贴为“ id = 0004”的位置,因此最后它将显示“ id = 0123456789” ”

Thanks 谢谢

There are several approaches to this. 有几种解决方法。 Below is one example to create a template which matches "Field": 下面是创建与“字段”匹配的模板的一个示例:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:param name="ename">Test</xsl:param>
    <xsl:param name="evalue">Test1234</xsl:param>
    <xsl:param name="removeElementsNamed" select="'Test'"/>
    <xsl:param name="id" select="0004"/>
    <xsl:output method="xml" encoding="utf-8"/>
    <xsl:template match="@*|node()" name="input">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="Root">
        <xsl:copy>
            <xsl:apply-templates/>
            <xsl:if test="not(c)">
                <xsl:element name="{$ename}">
                    <xsl:value-of select="$evalue"/>
                </xsl:element>
            </xsl:if>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="Root">
        <xsl:if test="not(name() = $removeElementsNamed)">
            <xsl:call-template name="input"/>
        </xsl:if>
    </xsl:template>
    <xsl:template match="Field">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:if test="@id = $id">
                <xsl:attribute name="id"><xsl:value-of select="ancestor::Message/metadata[2]/metadata-element/value"/></xsl:attribute>
            </xsl:if>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM