2016-11-15 85 views
2

我第一次在這裏發表但在這裏不用,XSLT需要幫助轉換XML顯示值和屬性

我有一個XML文檔是從我們的掃描系統,看起來像下面的輸出。

<?xml version="1.0" encoding="UTF-8"?> 
<DOCUMENT> 
<DOCUMENTINDEX Name="Company">LR</DOCUMENTINDEX> 
    <DOCUMENTINDEX Name="Contract Code">L1935</DOCUMENTINDEX> 
    <DOCUMENTINDEX Name="Entry Date">2016-11-14</DOCUMENTINDEX> 
    <DOCUMENTINDEX Name="Order Account">04060</DOCUMENTINDEX> 
    <DOCUMENTINDEX Name="Order Raised By">Jonathan Banks</DOCUMENTINDEX> 
    <DOCUMENTINDEX Name="Order Total">358</DOCUMENTINDEX> 
    <DOCUMENTINDEX Name="Purchase Order Date">2016-11-14</DOCUMENTINDEX> 
    <DOCUMENTINDEX Name="Purchase Order ID">PC022987-1</DOCUMENTINDEX> 
    <DOCUMENTINDEX Name="Supplier Code">04060</DOCUMENTINDEX> 
    <DOCUMENTINDEX Name="Supplier Name">Dynahurst Limited</DOCUMENTINDEX> 
    <DOCUMENTINDEX Name="VAT">71.6</DOCUMENTINDEX> 
</DOCUMENT>> 

我需要它看起來像下面,

<COMPANY>LR</COMPANY> 
<CONTRACT CODE>L1935</CONTRACT CODE> 

等等等等....

我想使用XSLT來排序這一點,至今已成功地拉出姓名部分,但我無法獲得價值。

我的劇本至今看起來像......

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
     <xsl:apply-templates select="//DOCUMENTINDEX"/> 
</xsl:template> 

<xsl:template match="DOCUMENTINDEX"> 
    <br/><xsl:value-of select="@Name"/> 
</xsl:template> 

有誰知道我可以做到這一點轉化爲模板,這樣我就可以投入到這個掃描軟件,使其能夠轉換文檔輸出他們被掃描到系統上。

這給了我以下輸出。

Company 
Contract Code 
Entry Date 
Order Account 
Order Raised By 
Order Total 
Purchase Order Date 
Purchase Order ID 
Supplier Code 
Supplier Name 
VAT 

感謝

克里斯

回答

0

嘿!

你可以得到當前處理元素的值:

<xsl:value-of select="."/>

XML元素名稱是無效用空格這樣你就可以將其刪除:

translate(./@Name,' ','')

您可以創建具有構造函數的XML元素,您可以在其中提供其名稱:

<xsl:element name="{translate(./@Name,' ','')}"/>

最終代碼如下所示:


<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <xsl:apply-templates select="//DOCUMENTINDEX"/> 
    </xsl:template> 
    <xsl:template match="DOCUMENTINDEX"> 
     <xsl:element name="{translate(./@Name,' ','')}"> 
      <xsl:value-of select="."/> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 
+0

謝謝菲利普這讓我們在正確的軌道幾tweeks,我們現在有工作,我們想要的方式。非常感謝你的幫助 !!!謝謝 – cgdean

+0

沒問題:)! –

1

這裏是一個可能的解決方案:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz '" /> 
    <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'" /> 

    <xsl:template match="/*"> 
     <xsl:for-each select="DOCUMENTINDEX"> 
      <xsl:variable name="name" select="@Name" /> 
      <xsl:element name="{translate($name, $smallcase, $uppercase)}"><xsl:value-of select="text()"/></xsl:element> 
     </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

請注意,你不能在元素名稱空間。因此,在轉型的過程中,我用下劃線取代它們_