您好我正在使用的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"
由于
答案 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>