首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT -动态映射列

XSLT -动态映射列
EN

Stack Overflow用户
提问于 2016-10-07 17:49:25
回答 2查看 596关注 0票数 0

我有3个不同的XML文件。其中一些是常见的,而另一些则不是。他们中的ordinalPosition正在发生变化。每次,我在我的ftp中得到新的文件,需要一个接一个地读取并加载到系统中。但是我不知道文件的列名。

代码语言:javascript
复制
  XML 1 :
  <?xml version="1.0" encoding="UTF-8"?>
    <SourceFile>
       <Data>
         <CustNo>126</CustNo>
         <Gender/>
         <isActive>0</isActive>
         <Email/>
       </Data>
    </SourceFile>   

XML 2 :
<?xml version="1.0" encoding="UTF-8"?>
 <SourceFile>
   <Data>
    <CustNo>124</CustNo>
    <Phone/>
    <Country/>
    <isActive>1</isActive>
   </Data>
 </SourceFile> 

XML 3:
<?xml version="1.0" encoding="UTF-8"?>
 <SourceFile>
   <Data>
    <KeyId>123</KeyId>
    <FirstName/>
    <LastName/>
    <Email/>  
    <isActive>0</isActive>
   </Data>
 </SourceFile> 

我对XSLT非常陌生。当文件到达我的ftp时,我想生成下面的输出。

代码语言:javascript
复制
  Result for XML 1 :
  <?xml version="1.0" encoding="UTF-8"?>
    <SourceFile>
      <Data>
        <KeyID>124</KeyID>  <!-- CustNo will be mapped to KeyId -->
        <FirstName/>
        <LastName/>
        <Email/> 
        <Phone/>
        <Country/>
        <isActive>0</isActive> 
      </Data>
    </SourceFile> 

非常感谢,Mehmet

EN

回答 2

Stack Overflow用户

发布于 2016-10-07 18:03:24

假设您总是希望所有列出的元素都出现在输出中(填充的或未填充的),并且希望它们按给定的顺序出现,您可以这样做:

XSLT 1.0

代码语言:javascript
复制
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/SourceFile">
    <xsl:copy>
        <xsl:for-each select="Data">
            <xsl:copy>
                <KeyID>
                    <xsl:value-of select="CustNo | KeyId"/>
                </KeyID>
                <FirstName>
                    <xsl:value-of select="FirstName"/>
                </FirstName>
                <LastName>
                    <xsl:value-of select="LastName"/>
                </LastName>
                <Email> 
                    <xsl:value-of select="Email"/>
                </Email> 
                <Phone>
                    <xsl:value-of select="Phone"/>
                </Phone>
                <Country>
                    <xsl:value-of select="Country"/>
                </Country>
                <isActive>
                    <xsl:value-of select="isActive"/>
                </isActive> 
            </xsl:copy>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>
票数 0
EN

Stack Overflow用户

发布于 2016-10-07 18:03:35

One try将为:

代码语言:javascript
复制
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="Data">
       <xsl:copy>
           <KeyID><xsl:value-of select="CustNo | KeyId"/></KeyID>
           <FirstName><xsl:value-of select="FirstName"/></FirstName>
           <Email><xsl:value-of select="Email"/></Email>
           <Phone><xsl:value-of select="Phone"/></Phone>
           <Country><xsl:apply-templates select="Country"/></Country>
           <isActive><xsl:value-of select="isActive"/></isActive>
       </xsl:copy>
    </xsl:template>

    <xsl:template match="Country">
        <xsl:value-of select="."/>
    </xsl:template>

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

</xsl:stylesheet>

说明:

在element Data上,您总是创建预期的结果。比如KeyIDFirstName等等。只要<xsl:value-of<xsl:apply-templates的select匹配,就会得到节点的内容。

<xsl:value-of />只返回一个元素的字符串。

<xsl:apply-templates />最终也会执行其他模板规则!例如,如果您有子节点,这一点很重要。您可以在元素Country的示例中看到这一点。

XML和XSLT区分大小写。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39914312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档