我继续遇到以下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
但在我的案例中,我没有看到我做错了什么。
答案 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)进行了检查。