2012-02-29 66 views
2

我在这个格式的XML的源列表源值结构映射到目标字段:生成XSLT取决于源内容

<metadata> 
    <metadatum> 
    <description>OnEnter</description> 
    <value>Hello World</id> 
    </metadatum> 
    <metadatum> 
    <description>OnLeave</description> 
    <value>Goodbye World</id> 
    </metadatum> 
</metadata> 

和目标结构是这样的:

<friendlyText> 
    <onEnter>[Content Here]</onEnter> 
    <onLeave>[Content Here]</onLeave> 
</friendlyText> 

是有可能创建一个XSLT,根据源的“描述”将元数据层次结构中的“值”字段映射到适当的目标节点上?

我试图用Altova MapForce做到这一点;感觉应该有一个接口来允许这个,我只是没有找到它。

+0

什么[内容这里]规定? – 2012-02-29 11:53:22

回答

0

该变换是可以与任何 “靶结构”,即一个单独的XML文档在工作的一般解决方案:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="my:my" exclude-result-prefixes="my"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:variable name="vUpper" select= 
    "'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/> 
<xsl:variable name="vLower" select= 
    "'abcdefghijklmnopqrstuvwxyz'"/> 

<my:target> 
    <friendlyText> 
    <onEnter>[Content Here]</onEnter> 
    <onLeave>[Content Here]</onLeave> 
    </friendlyText> 
</my:target> 

<xsl:variable name="vTarget" select="document('')/*/my:target/*"/> 

<xsl:variable name="vMeta" select="/*/metadatum"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="/"> 
    <xsl:apply-templates select="$vTarget"/> 
</xsl:template> 

<xsl:template match="friendlyText/*/text()"> 
    <xsl:value-of select= 
    "$vMeta[translate(description, $vLower, $vUpper) 
     = 
      translate(name(current()/..), $vLower, $vUpper) 
      ]/value"/> 
</xsl:template> 
</xsl:stylesheet> 

当应用于提供的XML文档(纠正为合格):

<metadata> 
    <metadatum> 
     <description>OnEnter</description> 
     <value>Hello World</value> 
    </metadatum> 
    <metadatum> 
     <description>OnLeave</description> 
     <value>Goodbye World</value> 
    </metadatum> 
</metadata> 

产生想要的,正确的结果

<friendlyText xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="my:my"> 
    <onEnter>Hello World</onEnter> 
    <onLeave>Goodbye World</onLeave> 
</friendlyText> 

请注意:只是为了方便, “目标结构” 是内嵌在这里。在真实世界的情况下,将“目标结构”保存在单独的文件中并使用document()函数加载它会更好。只有线路:

<xsl:variable name="vTarget" select="document('')/*/my:target/*"/> 

将需要更改为:

<xsl:variable name="vTarget" select="document('someFileUrl')/*"/> 
1
<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="metadata"> 
    <friendlyText> 
     <xsl:apply-templates select="metadatum"/> 
    </friendlyText> 
    </xsl:template> 

    <xsl:template match="metadatum"> 
    <xsl:element name="{description}"> 
     <xsl:value-of select="value"/> 
    </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

输出:

<?xml version="1.0" encoding="utf-8"?> 
<friendlyText> 
    <OnEnter>Hello World</OnEnter> 
    <OnLeave>Goodbye World</OnLeave> 
</friendlyText>