[英]XSLT - Dynamic Map Columns
我有3個不同的XML文件。 它們中的某些列是常見的,而某些列則不是。 並且它們的序數位置正在改變。 每次,我都會在ftp中獲取新文件,並且需要逐一讀取並加載到系統中。 但是我不知道文件的列名。
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時,我想生成以下輸出。
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
假設您始終希望所有列出的元素都存在於輸出中(無論是否填充),並且想要按給定的順序進行操作,則可以執行以下操作:
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: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>
一種嘗試是:
<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>
說明:
在元素Data
您始終可以創建預期的結果。 像KeyID
, FirstName
一樣,等等。每當<xsl:value-of
或<xsl:apply-templates
匹配時,就會得到node的內容。
<xsl:value-of />
僅返回元素的字符串。
<xsl:apply-templates />
最終還將執行其他模板規則! 例如,如果您有子節點,則這一點很重要。 您可以在元素Country
的示例中看到這一點。
XML和XSLT區分大小寫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.