XSLT无法转换消息

时间:2013-12-09 22:34:04

标签: xml xslt

您好我正在使用的xslt有问题。我正在尝试使用以下样式表转换消息:

<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>

以下是我的输入消息

<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>

我想要实现的基本上是获取元数据元素(sequence_no)的值,在这种情况下是“0123456789”,我想粘贴此值代替“id = 0004”,所以最后它将显示“ ID = 0123456789"

由于

1 个答案:

答案 0 :(得分:1)

有几种方法可以解决这个问题。下面是创建匹配“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>