2012-05-22 158 views
0

我遇到两个问题,试图处理具有递归标签的XML(在标签中重复的标签)。XSLT不是循环标签或选择第一个标签

问题#1“标题:”部分输出所有标题标签的文本连接,就好像它是从/中搜索而不是它所调用的路径。

问题#2 @id测试找不到任何东西,这可能是同一问题的症状。

这里是XSL:

<?xml version="1.0"?> 
<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"> 
<xsl:template match="/"> 
<xsl:template match="cog:rows"> 
    <xsl:apply-templates select="cog:rowEdge"/> 
</xsl:template> 
<xsl:template match="cog:rowEdge"> 
    <p><b>Caption:</b> <xsl:value-of select="cog:caption"/></p> 
    <xsl:if test="@id"> 
     <b>id:</b> <xsl:value-of select="@id"/><br/> 
    </xsl:if> 
    <xsl:if test="cog:rowEdge"> 
     <p>Looking at next rowEdge</p> 
     <xsl:apply-templates select="cog:rowEdge"/> 
    </xsl:if> 
</xsl:template> 
<html> 
<head><title>%s</title></head> 
<body> 
    <xsl:apply-templates select="cog:dataset/cog:crosstab/cog: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

在这种情况下是否可以发布您的预期输出?另外,您的XSLT示例无效,因为嵌套在中的''不被允许。 –

回答

0

样式表无效。模板是XSLT中的顶级元素,不能嵌套。如果您将它们分开,则样式表应该按预期工作:

<xsl:stylesheet version="1.0" 
    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"> 

    <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/> 
    </xsl:template> 

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