我通过文档功能引用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>
答案 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="."/>