簡體   English   中英

使用XSLT從一個XML到另一個XML的一對一映射

[英]One to One mapping from One XML to another XML using XSLT

我有兩個XSD。 這兩個XSD的示例XML如下所示

**XML -1**                            **XML -2**

<root>                                <parent>
  <e1 />                                <a1 />
  <e2 />                                <a2 />
    .                                     .
    .                                     .
    .                                     .
  <e600 />                              <a600/>
</root>                               </parent>

我需要編寫XSLT進行數據轉換。 元素“ e(i) ”的值需要映射到“ a(i)

現在我可以編寫如下的XSLT

<parent>
  <a1>
    <xsl:value-of select = "/root/e1/text()"/>
  </a1>
  <a2>
    <xsl:value-of select = "/root/e2/text()"/>
  </a2>
    .
    .
  <a600>
    <xsl:value-of select = "/root/e600/text()"/>
  </a600>
</parent>

但是這樣很繁瑣。 任何人都可以使用XSLT 1.0在一個模板內以較小的方式幫助或建議是否為此目的編寫XSLT。

怎么樣:

XSLT 1.0

<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:strip-space elements="*"/>

<xsl:template match="/root">
    <parent>
        <xsl:apply-templates/>
    </parent>
</xsl:template>

<xsl:template match="*">
    <xsl:element name="a{substring-after(name(), 'e')}">
        <xsl:value-of select="."/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

添加:

在實際的XSD中,元素的名稱不是這樣。 這600個元素具有不同的名稱,沒有數字,沒有共同之處

如果無法從源中計算目標元素的名稱,則必須訴諸某種lookup 這可以是每個元素的模板的形式,或者xsl:choose或從數組中選擇。

例如,您可以這樣做:

<xsl:template match="*">
    <xsl:variable name="name">
        <xsl:choose>
            <xsl:when test="name()='e1'">a1</xsl:when>
            <xsl:when test="name()='e2'">a2</xsl:when>
            <xsl:when test="name()='e600'">a600</xsl:when>
        </xsl:choose>
    </xsl:variable>
    <xsl:element name="{$name}">
        <xsl:value-of select="."/>
    </xsl:element>
</xsl:template>

也許更有效率:

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

<xsl:key name="nm" match="name" use="@source" />

<my:name-map>
    <name source="e1">a1</name>
    <name source="e2">a2</name>
    <name source="e600">a600</name>
</my:name-map>

<xsl:template match="/root">
    <parent>
        <xsl:apply-templates/>
    </parent>
</xsl:template>

<xsl:template match="*">
    <xsl:variable name="source-name" select="name()" />
    <xsl:variable name="target-name">
        <xsl:for-each select="document('')">
            <xsl:value-of select="key('nm', $source-name)"/>            
        </xsl:for-each>
    </xsl:variable>
    <xsl:element name="{$target-name}">
        <xsl:value-of select="."/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM