2012-05-22 24 views
0

为什么我的XSL在这个XML中找不到任何东西?我试图将cognos xml报告输出转换为另一种形式(是的,我知道cognos会生成html,但我需要其他的东西)。它只是产生单词“标题:”并停止。为什么我的XSL在这个XML中找不到任何东西?

这里是我的XSL:

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://developer.cognos.com/schemas/xmldata/1/" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"> 

    <xsl:template match="/"> 

    <xsl:template match="rows"> 
     <xsl:apply-templates select="rowEdge"/> 
    </xsl:template> 

    <xsl:template match="rowEdge"> 
     <b>Caption:</b> <xsl:value-of select="caption"/><br/> 
     <xsl:if test="@id"> 
      <b>id:</b> <xsl:value-of select="@id"/><br/> 
     </xsl:if> 
     <xsl:if test="rowEdge"> 
      <xsl:apply-templates select="rowEdge"/> 
     </xsl:if> 
    </xsl:template> 

    <html> 
     <head><title>%s</title></head> 
     <body> 
      <xsl:apply-templates select="dataset/crosstab/rows"/> 
     </body> 
    </html> 

    </xsl:template> 
</xsl:stylesheet> 

这里是XML(我不得不删除一些,但应该给一个想法):

<?xml version="1.0" encoding="utf-8" ?> 
<dataset xmlns="http://developer.cognos.com/schemas/xmldata/1/" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"> 
<crosstab> 
<values> 
    <value row="R1" col="C1" xs:nil="true" /> 
    <value row="R1" col="C2" xs:nil="true" /> 
    <value row="R1" col="C3" xs:nil="true" /> 
    <value row="R1" col="C4" xs:nil="true" /> 
    <value row="R1" col="C5" xs:nil="true" /> 
    <value row="R1" col="C6" xs:nil="true" /> 
    <value row="R1" col="C7" xs:nil="true" /> 
    <value row="R1" col="C8" xs:nil="true" /> 
    <value row="R1" col="C9" xs:nil="true" /> 
    <value row="R2" col="C1">0</value> 
    <value row="R2" col="C2">12.61728395</value> 
    <value row="R2" col="C3">1320.40677966</value> 
    <value row="R2" col="C4">7</value> 
    <value row="R2" col="C5">1.90318499</value> 
    <value row="R2" col="C6">108.66456135</value> 
    <value row="R2" col="C7">776.61407946</value> 
    <value row="R2" col="C8">-0.86007907</value> 
    <value row="R2" col="C9">46.53571429</value> 
</values> 
<corner> 
    <caption>Time Period: DCG Incurred Paid Year</caption> 
    </corner> 
<columns> 
<colEdge> 
    <caption>Jan 02 to Dec 02 {All Data} CRxIp</caption> 
<colEdge> 
    <caption>2002</caption> 
<colEdge id="C1"> 
    <caption>Member Age Avg</caption> 
    </colEdge> 
<colEdge id="C2"> 
    <caption>Days Supply Per Script Rx</caption> 
    </colEdge> 
<colEdge id="C3"> 
    <caption>Net Pay Per Pat Med</caption> 
    </colEdge> 
<colEdge id="C4"> 
    <caption>Days LOS Admit Acute</caption> 
    </colEdge> 
<colEdge id="C5"> 
    <caption>Days LOS Admit Acute</caption> 
    </colEdge> 
<colEdge id="C6"> 
    <caption>Allow Amt PMPM Med and Rx {Cmpl}</caption> 
    </colEdge> 
<colEdge id="C7"> 
    <caption>Allow Amt PMPM Med and Rx {Cmpl}</caption> 
    </colEdge> 
<colEdge id="C8"> 
    <caption>% Diff Allow Amt PMPM Med and Rx {Cmpl}</caption> 
    </colEdge> 
<colEdge id="C9"> 
    <caption>Relative Risk Score Prosp Explan NonRescaled</caption> 
    </colEdge> 
    </colEdge> 
    </colEdge> 
    </columns> 
<rows> 
<rowEdge> 
    <caption>Subsets</caption> 
<rowEdge> 
    <caption>Plan Type Medstat</caption> 
<rowEdge id="R1"> 
    <caption>Cohort Medstat</caption> 
    </rowEdge> 
    </rowEdge> 
    </rowEdge> 
<rowEdge> 
    <caption>Chronic Episodes</caption> 
<rowEdge> 
    <caption>HMO (Managed Care)</caption> 
<rowEdge id="R2"> 
    <caption>Females, Ages &lt; 1</caption> 
    </rowEdge> 
</rowEdge> 
</rowEdge> 
</rows> 
    </crosstab> 
    </dataset> 
+0

它看起来像你的根模板有点搞砸了 - 应该在HTML部分底部转到第一个模板? – Filburt

回答

0

在XSLT 1.0(您正在使用) ,在XPath表达式中不考虑默认名称空间。

激起你需要做的是:

1)分配一个前缀为您的实例文档的默认名称空间中的XSLT转换,例如:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="cog:http://developer.cognos.com/schemas/xmldata/1/" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"> 

2)各之前使用这个前缀元素名称(而不是之前属性名称)在你的XPath表达式:

<xsl:template match="cog:rowEdge"> 
    <b>Caption:</b> <xsl:value-of select="cog:caption"/><br/> 
    <xsl:if test="@id"> 
     <b>id:</b> <xsl:value-of select="@id"/><br/> 
    </xsl:if> 
    <xsl:if test="cog:rowEdge"> 
     <xsl:apply-templates select="cog:rowEdge"/> 
    </xsl:if> 
</xsl:template> 

注意:您不需要测试,有前一个cog:rowEdge pplying模板:在应用模板不会做任何事情,如果有在其选择的属性没有节点反正;)...

有样式表中的其他几个错误:

  1. 模板不能嵌入
  2. xsl:stylesheet元素中必须有版本属性。

正确的样式表是:

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:cog="http://developer.cognos.com/schemas/xmldata/1/" version="1.0"> 

    <xsl:template match="/"> 

     <html> 
      <head> 
       <title>%s</title> 
      </head> 
      <body> 
       <xsl:apply-templates select="cog:dataset/cog:crosstab/cog:rows"/> 
      </body> 
     </html> 

    </xsl:template> 

    <xsl:template match="cog:rows"> 
     <xsl:apply-templates select="cog:rowEdge"/> 
    </xsl:template> 

    <xsl:template match="cog:rowEdge"> 
     <b>Caption:</b> 
     <xsl:value-of select="cog:caption"/> 
     <br/> 
     <xsl:if test="@id"> 
      <b>id:</b> 
      <xsl:value-of select="@id"/> 
      <br/> 
     </xsl:if> 
     <xsl:apply-templates select="cog:rowEdge"/> 
    </xsl:template> 

</xsl:stylesheet> 
+0

谢谢。我也必须这样调用它: lkohl

+0

递归不起作用,它只是打印出整个文本(父母+孩子)的第一行边缘并退出。 – lkohl

+1

好吧,我专注于命名空间问题,这是一个非常常见的问题,但是看着你的XSLT,我发现还有一个问题:你不能像模板一样在模板中嵌入模板!要修复它,您需要将嵌入式模板移出根节点(/)的嵌入式模板,并在所有XPath表达式中的所有元素名称之前添加前缀。 –

相关问题