[英]extract each child node to create XML with parent nodes
我有一個輸入XML,如下所示。 我需要提取每個子<DETS>
並通過將其與其公共父節點合並來創建新的XML。
輸入:
<STDS>
<DEPT>ABC</DEPT>
<COD>123</COD>
<PIN>456</PIN>
<DETS>
<NAM>XYZ</NAM>
<AGE>21</AGE>
</DETS>
<DETS>
<NAM>KLM</NAM>
<AGE>22</AGE>
</DETS>
</STDS>
I need the output like following.
輸出:
<Students>
<Department>ABC</Department>
<Code>123</Code>
<Pin>456</Pin>
<Details>
<Name>XYZ</Name>
<Age>21</Age>
</Details>
</Students>
<Students>
<Department>ABC</Department>
<Code>123</Code>
<Pin>456</Pin>
<Details>
<Name>KLM</Name>
<Age>22</Age>
</Details>
</Students>
我嘗試使用for-each,但我無法做到。
這是我正在嘗試的代碼。 如果我將for-each保留在<students>
它將為<students>
每個孩子創建新的XML。 如果我在外面使用for-each XML,那么如何訪問<Students>
元素超出范圍。
<?xml version="1.0" encoding="utf-16"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var" exclude-result-prefixes="msxsl var s0 userCSharp" version="1.0" xmlns:ns0="Students" xmlns:s0="STDS" xmlns:userCSharp="http://schemas.microsoft.com/BizTalk/2003/userCSharp">
<xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
<xsl:template match="/">
<xsl:apply-templates select="/s0:STDS" />
</xsl:template>
<xsl:template match="/s0:STDS">
<ns0:Students>
<xsl:for-each select="s0:STDS">
<xsl:variable name="var:v1" select="s0:DEPT" />
<Department>
<xsl:value-of select="$var:v1" />
</Department>
<xsl:variable name="var:v2" select="s0:COD" />
<Code>
<xsl:value-of select="$var:v2" />
</Code>
<xsl:variable name="var:v3" select="s0:PIN)" />
<Pin>
<xsl:value-of select="$var:v3" />
</Pin>
<xsl:for-each select="s0:STDS/s0:DETS">
<ns0:Details>
<xsl:variable name="var:v4" select="s0:DETS/s0:NAM" />
<Name>
<xsl:value-of select="$var:v4" />
</Name>
<xsl:variable name="var:v5" select="s0:DETS/s0:AGE" />
<Age>
<xsl:value-of select="$var:v5" />
</Age>
<ns0:Details>
</xsl:for-each>
</xsl:for-each>
<ns0:Students>
</xsl:template>
../
功能可用於遍歷從子上下文到父上下文的XML級別。
以下是您可以使用的XSL模板。 請注意,輸入的XML共享沒有聲明任何名稱空間,因此在下面的解決方案中沒有名稱空間的引用。 這應該給你想要的輸出。
<xsl:template match="/">
<xsl:for-each select="STDS/DETS">
<Students>
<Department><xsl:value-of select="../DEPT" /></Department>
<Code><xsl:value-of select="../COD" /></Code>
<Pin><xsl:value-of select="../PIN" /></Pin>
<Details>
<Name><xsl:value-of select="NAM" /></Name>
<Age><xsl:value-of select="AGE" /></Age>
</Details>
</Students>
</xsl:for-each>
</xsl:template>
該問題被標記為BizTalk 。 這是正確的BizTalk Asnwer。
在Mapper中,您需要做的就是通過循環Functoid將<DETS>
連接到<Students>
。
這就是全部, 不需要自定義xslt 。 是的,就這么簡單。
__
沒有辦法編輯答案,因為對於兩個不同的問題它是相同的答案 。 這是BizTalk特定的情況。 問題是標記為BizTalk 。 雖然它們在技術上可能是正確的,但Xsl Answers並不是在BizTalk中執行此操作的正確方法。
刪除此答案只會刪除正確的BizTalk域特定答案。 如果這個答案再次被刪除,那么,我只是放棄,OP可以解決一個不必要的復雜和錯誤 (對於BizTalk)解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.