2017-05-16 69 views
-1

我有以下XML並需要將其轉換爲管道分隔值。約束是解決方案需要是一個通用的解決方案。用於將XML解析爲管道分隔值的通用XSLT

<Root> 
<Element> 
    <Value1>1</Value1> 
    <Value2>2</Value2> 
    <Value3/> 
    <Value4/> 
</Element> 
<Element> 
    <Value1>1</Value1> 
    <Value2>2</Value2> 
    <Value3>3</Value3> 
    <Value4>4</Value4> 
</Element> 
<Element> 
    <Value1>1</Value1> 
    <Value2/> 
    <Value3>3</Value3> 
    <Value4>4</Value4> 
</Element> 
</Root> 

的預期結果是:

1|2|| 
1|2|3|4 
1||3|4 

到目前爲止this聯繫是有益的我,但即使調整之後我couldnot動態獲取標籤名。有什麼辦法可以通過這個嗎?

+1

你可以使用'*'作爲通配符。發佈你的嘗試,如果你想更具體的建議。 –

+0

在給出的鏈接中有一些與標籤名稱相關的功能。我用*替換了硬編碼值。它正在打印標籤值,但不是在單個管道分隔值中。 – Arun

+1

請顯示您的代碼,以便我們可以重現您的問題。我不知道什麼「*與標籤名稱*相關的某些功能」的含義。 –

回答

1

如果你想根元素的所有子元素轉變成包含分離所有盛大子元素的值,然後線下應該做的:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <xsl:param name="lf" select="'&#10;'"/> 
    <xsl:param name="delim" select="'|'"/> 

    <xsl:output method="text"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/*/*"> 
     <xsl:apply-templates/> 
     <xsl:value-of select="$lf"/> 
    </xsl:template> 

    <xsl:template match="/*/*/*"> 
     <xsl:if test="position() > 1"> 
      <xsl:value-of select="$delim"/> 
     </xsl:if> 
     <xsl:value-of select="."/> 
    </xsl:template> 

</xsl:stylesheet> 
+0

完美。比我下面的回答好。完全通用的一個。謝謝 – Arun

0

經過太多的工作,我發現我自己的解決方案。

<?xml version="1.0" encoding="UTF-8"?> 
 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
 
<xsl:strip-space elements="*"/> 
 
\t <xsl:template match="/"> 
 
\t \t <xsl:for-each select="Element"> 
 
\t \t \t <xsl:for-each select="*"> 
 
\t \t \t \t <xsl:value-of select="." /> <xsl:if test="position() != last()">|<xsl:text/></xsl:if> 
 
\t \t \t \t 
 
\t \t \t </xsl:for-each> 
 
\t \t \t <xsl:text>&#xA;</xsl:text> 
 
\t \t </xsl:for-each> 
 
\t </xsl:template> 
 
\t 
 
</xsl:stylesheet>

+0

你確定你有''?在你的問題中,你的XSLT中沒有考慮'Root'元素。 –

+0

我是XSLT新手。我的代碼以某種方式工作,但需要指定第一個子節點。你的代碼是完全通用的,適合我的使用。我正在使用你的xslt。 – Arun