0

XSL がこの XML で処理するものを見つけられないのはなぜですか? cognos xml レポート出力を別の形式に変換しようとしています (はい、cognos が html を生成することは知っていますが、別のものが必要です)。「Caption:」という単語を生成して停止します。

ここに私の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>
4

1 に答える 1

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: いずれにせよ select 属性にノードがない場合、apply-templates は何もしません ;) ...

スタイルシートには他にもいくつかのエラーがあります。

  1. テンプレートを埋め込むことはできません
  2. xsl:stylesheet要素には version 属性が必要です。

正しいスタイルシートは次のようになります。

<?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>
于 2012-05-22T17:30:01.983 に答える