2014-11-22 24 views
1

我有一個XML文件,它有3列。使用XSLT旋轉三個XML值

User_Created Controlled_Drug_Name 計數

我想這個支點使用XSLT,這樣一列是行headinhgs,一個是行,另一種是數據。

E.e.

我想要沿着頂行的Drug_Created,然後是數據透視表中的每個數。

我到目前爲止有哪些名稱和藥物,但計數沒有填充。

任何幫助,將不勝感激。

<?xml version="1.0" encoding="utf-8"?> 
<!-- Copyright Strand Technology Ltd, 2008 --> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:cn="http://www.strandtechnology.co.uk/carenotes" version="1.0"> 
    <xsl:output method="html" indent="yes" /> 
    <xsl:key name="UserHeader" match="QueryResults/Data/DataRow" use="User_Created" /> 
    <xsl:key name="DrugHeader" match="QueryResults/Data/DataRow" use="Controlled_Drug_Name" /> 
    <xsl:template match="QueryResults"> 
    <table> 
     <tr style="text-align:center;"> 
     <td>DRUG NAME</td> 
     <xsl:for-each select="Data/DataRow[count(. | key('UserHeader', User_Created)[1]) = 1]"> 
      <td> 
      <xsl:value-of select="User_Created" /> 
      </td> 
     </xsl:for-each> 
     </tr> 
     <xsl:for-each select="Data/DataRow[count(. | key('DrugHeader', Controlled_Drug_Name)[1]) = 1]"> 
     <tr style="text-align:center;"> 
      <td> 
      <xsl:value-of select="Controlled_Drug_Name" /> 
      </td> 
      <xsl:for-each select="Data/DataRow[count(. | key('UserHeader', User_Created)[1]) = 1]"> 
      <td> 
       <xsl:value-of select="count" /> 
        </td> 
      </xsl:for-each> 
     </tr> 
     </xsl:for-each> 
    </table> 
    </xsl:template> 
</xsl:stylesheet> 

回答

1

由於您沒有提供XML的一部分作爲示例,這只是一個猜測。但如果在輸入XML節點/列的名稱是Count,如果你改變

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

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

更新它可以工作:正如在評論中提到,列名字是數字,所以這不是命名的問題。我剛剛創建了一個示例輸入,並不知道這是否與實際輸入匹配,而採用不同的方法來獲取表。

輸入XML:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <QueryResults> 
    <Data> 
     <DataRow> 
      <User_Created>user 1</User_Created> 
      <Controlled_Drug_Name>name 1</Controlled_Drug_Name> 
      <count>1</count> 
     </DataRow> 
     <DataRow> 
      <User_Created>user 2</User_Created> 
      <Controlled_Drug_Name>name 2</Controlled_Drug_Name> 
      <count>2</count> 
     </DataRow> 
     <DataRow> 
      <User_Created>user 3</User_Created> 
      <Controlled_Drug_Name>name 3</Controlled_Drug_Name> 
      <count>3</count> 
     </DataRow> 
     <DataRow> 
      <User_Created>user 1</User_Created> 
      <Controlled_Drug_Name>name 3</Controlled_Drug_Name> 
      <count>4</count> 
     </DataRow> 
     <DataRow> 
      <User_Created>user 2</User_Created> 
      <Controlled_Drug_Name>name 3</Controlled_Drug_Name> 
      <count>5</count> 
     </DataRow> 
     <DataRow> 
      <User_Created>user 2</User_Created> 
      <Controlled_Drug_Name>name 4</Controlled_Drug_Name> 
      <count>5</count> 
     </DataRow> 
    </Data> 
    </QueryResults> 
</root> 

XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:key name="kUsers" match="User_Created" use="."/> 
    <xsl:key name="kRowByName" match="DataRow" use="Controlled_Drug_Name"/> 
    <xsl:variable name="users" select= 
     "//User_Created 
     [generate-id() 
     = 
     generate-id(key('kUsers', .)[1]) 
     ] 
     "/> 
    <xsl:template match="QueryResults"> 
    <html> 
     <table> 
      <thead> 
       <th>Name</th> 
       <xsl:apply-templates select="$users"/> 
      </thead> 
      <tbody> 
       <xsl:apply-templates select= 
       "//DataRow 
       [generate-id() = 
       generate-id(key('kRowByName', Controlled_Drug_Name))]"> 
       <xsl:sort select="Controlled_Drug_Name"/> 
       </xsl:apply-templates> 
      </tbody> 
     </table> 
    </html> 
    </xsl:template> 
    <xsl:template match="User_Created"> 
    <th> 
     <xsl:value-of select="."/> 
    </th> 
    </xsl:template> 
    <xsl:template match="DataRow"> 
    <tr> 
     <td> 
      <xsl:value-of select="Controlled_Drug_Name"/> 
     </td> 
     <xsl:apply-templates select="$users" mode="row"> 
      <xsl:with-param name="nRows" 
      select="key('kRowByName', Controlled_Drug_Name)"/> 
     </xsl:apply-templates> 
    </tr> 
    </xsl:template> 
    <xsl:template match="User_Created" mode="row"> 
    <xsl:param name="nRows"/> 
    <td> 
     <xsl:value-of select= 
     "$nRows[User_Created=current()]/count"/> 
    </td> 
    </xsl:template> 
</xsl:stylesheet> 

輸出:

<html> 
<table> 
    <thead> 
    <th>Name</th> 
    <th>user 1</th> 
    <th>user 2</th> 
    <th>user 3</th> 
    </thead> 
    <tbody> 
    <tr> 
     <td>name 1</td> 
     <td>1</td> 
     <td></td> 
     <td></td> 
    </tr> 
    <tr> 
     <td>name 2</td> 
     <td></td> 
     <td>2</td> 
     <td></td> 
    </tr> 
    <tr> 
     <td>name 3</td> 
     <td>4</td> 
     <td>5</td> 
     <td>3</td> 
    </tr> 
    <tr> 
     <td>name 4</td> 
     <td></td> 
     <td>5</td> 
     <td></td> 
    </tr> 
    </tbody> 
</table> 
</html> 

也許你可以使用這種方法與實際投入一起工作。

+0

對不起,數據非常敏感,所以我不想在這裏添加它。但是在我的例子中,count列的名字有一個小小的c。儘管感謝您的評論。 – user3284707 2014-11-22 11:29:18

+0

我覺得伯爵需要某種方式組合兩個鍵? – user3284707 2014-11-22 11:30:14

+0

@ user3284707是的。剛剛更新了一些示例輸入和調整方法的答案。 – 2014-11-22 13:13:35