XSLT未正确应用于XML文件

XSLT未正确应用于XML文件,xml,xslt,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

我对以下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>
我用作示例的学习材料如下:

https://www.w3schools.com/xml/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog
但是我看不出在我的例子中我做错了什么。

您(正确地)声明了
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>

数字测量PCI屏幕信息:
前缀:
前缀:
名字:
首选名:
中间名:


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

您的困难源于命名空间问题。
因此,请参考
规则中的命名空间“”

这是一个如何做到这一点的示例:

<?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>

数字测量PCI屏幕信息:
前缀:

前缀:
名字:
首选名:
中名:

要更正的第一件事:从
样式表
标记的末尾删除
-->

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

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

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

“我希望输出在其自己的行上显示人员信息中的每个项目”--不,您希望XSLT输出HTML,并在其自己的行上显示每个项目。要从等式中删除浏览器,请在本地运行转换,捕获HTML输出,并向我们显示该输出,而不是浏览器所做的。这是一个名称空间问题,而且标识模板是不必要的,应该删除。在XPath中,即使在样式表中有一个<代码> xMLNS=…,也可以将非前缀匹配放在空白命名空间中。只需搜索“XSLT默认命名空间”就可以找到日常问题的每日答案。(顺便说一句,为了学习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()|@*">         <!-- 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>
<xsl:template match="dta:Data">
  <html>
    <body bgcolor="lightgreen">
      <xsl:apply-templates select="dta:Record/dta:PCI" />
    </body>
  </html>
</xsl:template>
<?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>