XSLT未正确应用于XML文件

时间:2017-03-15 19:47:25

标签: xml xslt

我继续遇到以下2个文件的问题:

这是我的XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="try.xsl" ?>
<Data xmlns="http://www.digitalmeasures.com/schema/data" xmlns:dmd="http://www.digitalmeasures.com/schema/data-metadata" dmd:date="2017-03-08">
    <Record userId="736234" username="sample" termId="1281" dmd:surveyId="5792614">
            <dmd:IndexEntry indexKey="COLLEGE" entryKey="College Name" text="College Name"/>
            <PCI id="27109339736" dmd:lastModified="2016-12-28T17:50:26">
                    <PREFIX>Mr.</PREFIX>
                    <FNAME>John</FNAME>
                    <PFNAME>John</PFNAME>
                    <MNAME/>
                    <LNAME>Smith</LNAME>
                    <SUFFIX>Jr</SUFFIX>
                    <ALT_NAME>J</ALT_NAME>
                    <ENDPOS/>
                    <EMAIL>sample@domain.com</EMAIL>
                    <BUILDING>Central</BUILDING>
                    <ROOMNUM>100</ROOMNUM>
                    <OPHONE1>303</OPHONE1>
                    <OPHONE2>555</OPHONE2>
                    <OPHONE3>1212</OPHONE3>
                    <DPHONE1>303</DPHONE1>
                    <DPHONE2>555</DPHONE2>
                    <DPHONE3>1213</DPHONE3>
                    <FAX1/>
                    <FAX2/>
                    <FAX3/>
                    <WEBSITE/>
                    <DTM_DOB/>
                    <DTD_DOB/>
                    <DTY_DOB/>
                    <DOB_START></DOB_START>
                    <DOB_END></DOB_END>
                    <BIO/>
                    <TEACHING_INTERESTS/>
                    <RESEARCH_INTERESTS/>
            </PCI>
    </Record>
</Data>

这是我的XSL文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dta="http://www.digitalmeasures.com/schema/data"
xmlns:dmd="http://www.digitalmeasures.com/schema/data-metadata"
exclude-result-prefixes="dta dmd">-->
<xsl:output method="html" />


  <xsl:template match="node()|@*">         <!-- identity template -->
    <xsl:copy>
     <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="Data">             <!-- matches /Data root element -->
    <html>
      <body bgcolor="lightgreen">
        <xsl:apply-templates select="node()|@*" />
      </body>
    </html>
  </xsl:template>

  <xsl:template match="Record/PCI">      <!-- matches sub-elements -->
    <h1>Digital Measures PCI Screen Info:</h1>
    <B>Prefix: </B><xsl:value-of select="PREFIX"/><br />
    <B>Prefix: </B><xsl:value-of select="PREFIX"/><br />
    <B>First Name: </B><xsl:value-of select="FNAME"/><br />
    <B>Preferred First Name: </B><xsl:value-of select="FNAME"/><br />
    <B>Middle Name: </B><xsl:value-of select="MNAME"/><br />
  </xsl:template>

</xsl:stylesheet>

我希望输出显示每个XSLT文件的人员信息中的每个项目,但我的输出是:

Mr. John John Smith Jr J sample@domain.com Central 100 303 555 1212 303 555 1213

我用作学习材料的例子是:

https://www.w3schools.com/xml/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog

但在我的案例中,我没有看到我做错了什么。

3 个答案:

答案 0 :(得分:0)

您(正确地)声明了dta前缀并将其绑定到输入XML默认命名空间 - 但您没有使用它。因此,您的第二个和第三个模板不匹配任何内容,整个输入由第一个模板处理,产生的输出与输入相同。

尝试改为:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dta="http://www.digitalmeasures.com/schema/data"
xmlns:dmd="http://www.digitalmeasures.com/schema/data-metadata"
exclude-result-prefixes="dta dmd">
<xsl:output method="html" />

  <xsl:template match="dta:Data">             <!-- matches /Data root element -->
    <html>
      <body bgcolor="lightgreen">
        <xsl:apply-templates/>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="dta:Record/dta:PCI">      <!-- matches sub-elements -->
    <h1>Digital Measures PCI Screen Info:</h1>
    <B>Prefix: </B><xsl:value-of select="dta:PREFIX"/><br />
    <B>Prefix: </B><xsl:value-of select="dta:PREFIX"/><br />
    <B>First Name: </B><xsl:value-of select="dta:FNAME"/><br />
    <B>Preferred First Name: </B><xsl:value-of select="dta:FNAME"/><br />
    <B>Middle Name: </B><xsl:value-of select="dta:MNAME"/><br />
  </xsl:template>

</xsl:stylesheet>

另请注意,第5行中有一个不匹配的-->结束评论标记。

答案 1 :(得分:0)

您的困难是由命名空间问题引起的 因此,请参阅<xsl:template...>规则中的命名空间“http://www.digitalmeasures.com/schema/data”。

这是如何执行此操作的示例:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:dta="http://www.digitalmeasures.com/schema/data" 
xmlns:dmd="http://www.digitalmeasures.com/schema/data-metadata" 
exclude-result-prefixes="dta dmd">
    <xsl:output method="html" />

    <xsl:template match="node()|@*">         <!-- identity template -->
        <xsl:copy>
            <xsl:apply-templates select="node()|@*" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="dta:Data">             <!-- matches /Data root element -->
        <html>
            <body bgcolor="lightgreen">
                <xsl:apply-templates select="node()|@*" />
            </body>
        </html>
    </xsl:template>

    <xsl:template match="dta:Record/dta:PCI">       <!-- matches sub-elements -->
        <h1>Digital Measures PCI Screen Info:</h1>
        <B>Prefix: </B>
        <xsl:value-of select="dta:PREFIX" />
        <br />
        <B>Prefix: </B>
        <xsl:value-of select="dta:PREFIX" />
        <br />
        <B>First Name: </B>
        <xsl:value-of select="dta:FNAME" />
        <br />
        <B>Preferred First Name: </B>
        <xsl:value-of select="dta:FNAME" />
        <br />
        <B>Middle Name: </B>
        <xsl:value-of select="dta:MNAME" />
        <br />
    </xsl:template>

</xsl:stylesheet>

答案 2 :(得分:0)

要纠正的第一件事:从-->标记的末尾删除stylesheet

第二件事:添加缺少的命名空间。匹配Data的模板 应该是:

<xsl:template match="dta:Data">
  <html>
    <body bgcolor="lightgreen">
      <xsl:apply-templates select="dta:Record/dta:PCI" />
    </body>
  </html>
</xsl:template>

请注意,我还更改了select中的apply-templates属性。 此更改可让您立即“执行”Record/PCI, 省略Record(及其属性)和IndexEntry的执行。它们都不是HTML标记。

最后一件事:你的模板应该从最后开始 <xsl:template match="dta:PCI">(你也错过了命名空间)。 在所有dta:属性中添加select

所以整个XSLT应该如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:dta="http://www.digitalmeasures.com/schema/data"
  xmlns:dmd="http://www.digitalmeasures.com/schema/data-metadata"
  exclude-result-prefixes="dta dmd">
<xsl:output method="html" />

  <xsl:template match="node()|@*">
    <xsl:copy><xsl:apply-templates select="node()|@*"/></xsl:copy>
  </xsl:template>

  <xsl:template match="dta:Data">
    <html>
      <body bgcolor="lightgreen">
        <xsl:apply-templates select="dta:Record/dta:PCI" />
      </body>
    </html>
  </xsl:template>

  <xsl:template match="dta:PCI">
    <h1>Digital Measures PCI Screen Info:</h1>
    <B>Prefix: </B><xsl:value-of select="dta:PREFIX"/><br />
    <B>Prefix: </B><xsl:value-of select="dta:PREFIX"/><br />
    <B>First Name: </B><xsl:value-of select="dta:FNAME"/><br />
    <B>Preferred First Name: </B><xsl:value-of select="dta:FNAME"/><br />
    <B>Middle Name: </B><xsl:value-of select="dta:MNAME"/><br />
  </xsl:template>

</xsl:stylesheet>

我使用Xalan引擎使用在线XSLT验证程序(xsltransform.net)进行了检查。