XSL - 基于文档xml和输入xml映射获得区别

时间:2011-10-20 09:17:48

标签: xml xslt

我通过文档功能引用xml文件(document.xml)。根据输入的xml id值,我从document.xml获取相应的值。输出将具有此对应值和输入中的位置,如actualoutput.xml中所示。 但是,想要生成类似expectedOutput.xml的输出xml,其属性为Value。有谁可以请指出如何更改我的xsl文件以获取expectedOutput.xml?

下面是文件 XslFile.xsl

<xsl:stylesheet version="1.0" exclude-result-prefixes="msxsl" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <result>
            <xsl:apply-templates select="/*/id"/>
        </result>
    </xsl:template>
    <xsl:template match="id">
        <xsl:variable name="currencydetails" select="document('document.xml')/doc"/>
        <xsl:variable name="id">
            <xsl:value-of select="."/>
        </xsl:variable>
        <mapValue>
            <xsl:variable name="fromDocument" select="$currencydetails/id[@value=$id]"/>
            <xsl:value-of select="$fromDocument"/>
        </mapValue>
        <position>
            <xsl:value-of select="position()"/>
        </position>
    </xsl:template>
</xsl:stylesheet>

document.xml中

    <doc>
   <id value="123">abc</id>
   <id value="456">abc</id>
   <id value="011">def</id>
   <id value="rty">ghj</id>
   <id value="iop">qwd</id>
   <id value="321">ply</id>
</doc>

input.xml中

    <Root>
   <id>123</id>
   <id>321</id>
   <id>897</id>
   <id>011</id>
   <id>456</id>
</Root>

actualoutput.xml - 我只能到达这里

    <result>
   <mapValue>abc</mapValue>
   <position>1</position>
   <mapValue>ply</mapValue>
   <position>2</position>
   <mapValue/>
   <position>3</position>
   <mapValue>def</mapValue>
   <position>4</position>
   <mapValue>abc</mapValue>
   <position>5</position>
</result>

expectedoutput.xml - 我想要什么

    <result>
   <map Value="abc">
      <position>1</position>
      <position>5</position>
   </map>
   <map Value="nomatch">
      <position>3</position>
   </map>
   <map Value="def">
      <position>4</position>
   </map>
   <map Value="ply">
      <position>2</position>
   </map>
</result>

感谢。我将阅读更多关于xsl:number和position()函数的信息

但是,对于上述解决方案,我得到以下回复。你能指导/帮助我吗?输出应根据'fromdocument'的值进行映射。

<result>
    <map value="abc"/>
    <position>1</position>
    <map value="ply"/>
    <position>6</position>
    <map value=""/>
    <position/>
    <map value="def"/>
    <position>3</position>
    <map value="abc"/>
    <position>2</position>
</result>

1 个答案:

答案 0 :(得分:1)

更改

<mapValue>
    <xsl:variable name="fromDocument" select="$currencydetails/id[@value=$id]"/>
    <xsl:value-of select="$fromDocument"/>
</mapValue>

<xsl:variable name="fromDocument" select="$currencydetails/id[@value=$id]"/>
<map value="{$fromDocument}"/>

更改

<position>
    <xsl:value-of select="position()"/>
</position>

<position>
    <xsl:number select="$fromDocument"/>
</position>

或在XSLT 1.0中,

<position>
    <xsl:for-each select="$fromDocument">
        <xsl:number/>
    </xsl:for-each>
</position>

(在没有阅读规范的情况下,你是错误地猜到了位置()的人之一。

(风格和性能改进)改变

<xsl:variable name="id">
    <xsl:value-of select="."/>
</xsl:variable>

<xsl:variable name="id" select="."/>