我必須轉換一個類似于下面的 xml 訊息。每個節點的源內容實際上是相同的,具有不同的節點名稱(parentitem、childitem、subchild)。
我繼承了一個 XSLT,它通過使用很少的模板對每個案例進行硬編碼來解決解決方案,這具有大量重復的 XSLT。
我想知道我有哪些選項可以優化 XSLT 以減少 XSLT 的重復。
我嘗試為通用“節點”設定單個模板;然后嘗試使用呼叫模板;但是我無法弄清楚如何在泛型中嵌套物件
任何幫助表示贊賞,謝謝。
<item>
<itemdetail>
<parentitem>
<item>001</item>
<code1>1</code1>
<code2>2</code2>
<itemattribute>
<item_desc>ParentItem</item_desc>
</itemattribute>
</parentitem>
<childitem>
<item>002</item>
<code1>2</code1>
<code2>2</code2>
<itemattribute>
<item_desc>ChildItemLevel1</item_desc>
</itemattribute>
</childitem>
<subchildren>
<subchild>
<item>003</item>
<code1>2</code1>
<code2>1</code2>
<itemattribute>
<item_desc>SubChild003</item_desc>
</itemattribute>
</subchild>
<subchild>
<item>004</item>
<code1>2</code1>
<code2>1</code2>
<itemattribute>
<item_desc>SubChild004</item_desc>
</itemattribute>
</subchild>
</subchildren>
</itemdetail>
</item>
訊息有一些變體需要轉換,看起來與下面類似。
- 父和子將只有 0 或 1 個實體
- Child 嵌套在 Parent 下
- SubChild(ren) 嵌套在 Child 之下
| 案件 | 父項節點 | 子項存在 | 子孩子在場 |
|---|---|---|---|
| 情況1 | 是 | 是 | 是 |
| 案例二 | 是 | N | N |
| 案例3 | 是 | 是 | N |
| 案例四 | N | 是 | N |
| 案例5 | N | 是 | 是 |
| 案例6 | N | N | 是 |
情況1
<Products>
<Product type="parentitem">
<item>001</item>
<code1>1</code1>
<code2>2</code2>
<itemattribute>
<item_desc>parentitem</item_desc>
</itemattribute>
<Product type="childitem">
<item>002</item>
<code1>2</code1>
<code2>2</code2>
<itemattribute>
<item_desc>childitem</item_desc>
</itemattribute>
<Product type="subchild">
<item>003</item>
<code1>2</code1>
<code2>1</code2>
<itemattribute>
<item_desc>SubChild003</item_desc>
</itemattribute>
</Product>
<Product type="subchild">
<item>004</item>
<code1>2</code1>
<code2>1</code2>
<itemattribute>
<item_desc>SubChild004</item_desc>
</itemattribute>
</Product>
</Product>
</Product>
</Products>
案例二
<Products>
<Product type="parentitem">
<item>001</item>
<code1>1</code1>
<code2>2</code2>
<itemattribute>
<item_desc>parentitem</item_desc>
</itemattribute>
</Product>
</Products>
案例3
<Products>
<Product type="parentitem">
<item>001</item>
<code1>1</code1>
<code2>2</code2>
<itemattribute>
<item_desc>parentitem</item_desc>
</itemattribute>
<Product type="childitem">
<item>002</item>
<code1>2</code1>
<code2>2</code2>
<itemattribute>
<item_desc>childitem</item_desc>
</itemattribute>
</Product>
</Product>
</Product>
</Products>
uj5u.com熱心網友回復:
這樣的事情對你有用嗎?我相信它涵蓋的案例比您闡述的 6 個案例還要多。
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="itemdetail">
<Products>
<xsl:apply-templates select="parentitem"/>
<xsl:apply-templates select="childitem[not(../parentitem)]"/>
<xsl:apply-templates select="subchildren[not(../parentitem | ../childitem)]"/>
</Products>
</xsl:template>
<xsl:template match="parentitem">
<Product type="parentitem">
<xsl:copy-of select="*"/>
<xsl:apply-templates select="../childitem"/>
<xsl:apply-templates select="../subchildren[not(../childitem)]"/>
</Product>
</xsl:template>
<xsl:template match="childitem">
<Product type="childitem">
<xsl:copy-of select="*"/>
<xsl:apply-templates select="../subchildren"/>
</Product>
</xsl:template>
<xsl:template match="subchild">
<Product type="subchild">
<xsl:copy-of select="*"/>
</Product>
</xsl:template>
</xsl:stylesheet>
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/316673.html
下一篇:在Pyspark中讀取xml檔案
