[英]How to get the attributes from an XML using XSLT?
这是我正在使用的 XML,我必须从中获取所有属性名称的属性值。
<?xml version="1.0" encoding="UTF-8"?>
<prodxml>
<prodxml><revisionNumber>05</revisionNumber><RosettaNet>
<Property name="Brush Thickness" ShortName="BRTHK" LongDesc="Brush Thickness" Code="1750" SubCode="" UCL="0.4400" LCL="0.4120"/>
<Property name="Bristle Diameter" ShortName="BAAA" LongDesc="Bristle Diameter" Code="306" SubCode="" UCL="0.005317" LCL="0.004806"/>
<Property name="Bristle Density" ShortName="BRD" LongDesc="Bristle Density" Code="305" SubCode="" UCL="96.2" LCL="72.0"/>
<Property name="Resin Density" ShortName="RDEN" LongDesc="Resin Density" Code="1749" SubCode="" UCL="203" LCL="193"/>
<Property name="Brush Thickness Range" ShortName="BRTHR" LongDesc="Brush Thickness Range" Code="2442" SubCode="" UCL="0.012" LCL="0"/>
<Property name="Bristle Diameter Range" ShortName="BAAD" LongDesc="Bristle Diameter Range" Code="311" SubCode="" UCL="0.00105" LCL="0"/>
<Property name="Bristle Density Range" ShortName="BRDR" LongDesc="Bristle Density Range" Code="310" SubCode="" UCL="29" LCL="0"/>
<Property name="Resin Density Range" ShortName="RDENR" LongDesc="Resin Density Range" Code="1753" SubCode="" UCL="20" LCL="0"/>
</RosettaNet>
<B2B_Customer>
<RecipientName>Intel</RecipientName>
</B2B_Customer>
</prodxml>
</prodxml>
这是我正在使用的 XSLT,但无法检索值。 有人可以帮忙吗?
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<xsl:element name="UCL" namespace="x-schema:../Schema/ChemGasQualityCertificateSchema2001Jul.xml">
<xsl:value-of select="//RosettaNet/Property/@UCL" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
谢谢回复。 请找到预期的输出
<?xml version="1.0"?>
<UCL xmlns="x-schema:../Schema/ChemGasQualityCertificateSchema2001Jul.xml">0.4400</UCL>
<UCL xmlns="x-schema:../Schema/ChemGasQualityCertificateSchema2001Jul.xml">0.005317</UCL>
<UCL xmlns="x-schema:../Schema/ChemGasQualityCertificateSchema2001Jul.xml">96.2</UCL>
<UCL xmlns="x-schema:../Schema/ChemGasQualityCertificateSchema2001Jul.xml">203</UCL>
<UCL xmlns="x-schema:../Schema/ChemGasQualityCertificateSchema2001Jul.xml">0.012</UCL>
<UCL xmlns="x-schema:../Schema/ChemGasQualityCertificateSchema2001Jul.xml">0.00105</UCL>
<UCL xmlns="x-schema:../Schema/ChemGasQualityCertificateSchema2001Jul.xml">29</UCL>
<UCL xmlns="x-schema:../Schema/ChemGasQualityCertificateSchema2001Jul.xml">20</UCL>
您当前没有对各个节点进行任何迭代。
在 XSLT 中,这是通过两种方式完成的:
<xsl:for-each>
- 大多数语言中常见的传统循环
<xsl:apply-templates>
- 即迭代地将每个节点传递给模板以供进一步处理
这是后者的示例:
<!-- root template -->
<xsl:template match="/">
<xsl:apply-templates match='//RosettaNet/Property' />
</xsl:template>
<!-- match 'Property' nodes and output 'UCL' node for each one -->
<xsl:template match='Property'>
<xsl:element name="UCL" namespace="x-schema:../Schema/ChemGasQualityCertificateSchema2001Jul.xml">
<xsl:value-of select="@UCL" />
</xsl:element>
</xsl:template>
在 XSLT 中,节点访问有两种基本范式(其中包括您问题中的属性等其他节点类型)。 这些范式被简称为“推”和“拉”。
“推送”涉及使用模板匹配以更类似流程的方式访问内容。 换句话说,当XSLT 处理器(例如Saxon)推送一个节点,通过该节点与一个(或多个)模板匹配时,该(一个或多个)模板被激活。 (现在让我们坚持使用单数形式的“模板”。如果您有多个模板匹配,则会进入称为优先级设置的内容,您应该了解它,但这超出了本问题的范围。)根据“ XSLT 的超人”,Michael Kay 博士,push 是一个完全没有得到充分利用的范例,出于多种原因,应该编写更多的样式表来利用这一点。
如果您愿意,“拉”涉及专门拉出您需要的节点/内容。 如果可用,处理器就会出去并获取您正在寻找的任何内容 - 无需模板。
关于您的特定问题,以下样式表(在 XSLT 1.0 下也有效):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<xsl:call-template name="pull_example"/>
<!-- <xsl:call-template name="push_example"/> -->
</xsl:template>
<xsl:template name="pull_example">
<!-- By "Pull" -->
<Root>
<xsl:for-each select="//Property/@UCL">
<xsl:element name="UCL" namespace="x-schema:../Schema/ChemGasQualityCertificateSchema2001Jul.xml">
<xsl:value-of select="."/>
</xsl:element>
</xsl:for-each>
</Root>
</xsl:template>
<xsl:template name="push_example">
<!-- By "Push" -->
<xsl:element name="Root">
<xsl:apply-templates select="//Property/@UCL" mode="push_mode"/>
</xsl:element>
</xsl:template>
<xsl:template match="//Property/@UCL" mode="push_mode">
<xsl:element name="UCL" namespace="x-schema:../Schema/ChemGasQualityCertificateSchema2001Jul.xml">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
应用于您的数据:
<?xml version="1.0" encoding="UTF-8"?>
<prodxml>
<prodxml>
<revisionNumber>05</revisionNumber>
<RosettaNet>
<Property name="Brush Thickness" ShortName="BRTHK" LongDesc="Brush Thickness" Code="1750" SubCode="" UCL="0.4400" LCL="0.4120"/>
<Property name="Bristle Diameter" ShortName="BAAA" LongDesc="Bristle Diameter" Code="306" SubCode="" UCL="0.005317" LCL="0.004806"/>
<Property name="Bristle Density" ShortName="BRD" LongDesc="Bristle Density" Code="305" SubCode="" UCL="96.2" LCL="72.0"/>
<Property name="Resin Density" ShortName="RDEN" LongDesc="Resin Density" Code="1749" SubCode="" UCL="203" LCL="193"/>
<Property name="Brush Thickness Range" ShortName="BRTHR" LongDesc="Brush Thickness Range" Code="2442" SubCode="" UCL="0.012" LCL="0"/>
<Property name="Bristle Diameter Range" ShortName="BAAD" LongDesc="Bristle Diameter Range" Code="311" SubCode="" UCL="0.00105" LCL="0"/>
<Property name="Bristle Density Range" ShortName="BRDR" LongDesc="Bristle Density Range" Code="310" SubCode="" UCL="29" LCL="0"/>
<Property name="Resin Density Range" ShortName="RDENR" LongDesc="Resin Density Range" Code="1753" SubCode="" UCL="20" LCL="0"/>
</RosettaNet>
<B2B_Customer>
<RecipientName>Intel</RecipientName>
</B2B_Customer>
</prodxml>
</prodxml>
产生这个输出:
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<UCL xmlns="x-schema:../Schema/ChemGasQualityCertificateSchema2001Jul.xml">0.4400</UCL>
<UCL xmlns="x-schema:../Schema/ChemGasQualityCertificateSchema2001Jul.xml">0.005317</UCL>
<UCL xmlns="x-schema:../Schema/ChemGasQualityCertificateSchema2001Jul.xml">96.2</UCL>
<UCL xmlns="x-schema:../Schema/ChemGasQualityCertificateSchema2001Jul.xml">203</UCL>
<UCL xmlns="x-schema:../Schema/ChemGasQualityCertificateSchema2001Jul.xml">0.012</UCL>
<UCL xmlns="x-schema:../Schema/ChemGasQualityCertificateSchema2001Jul.xml">0.00105</UCL>
<UCL xmlns="x-schema:../Schema/ChemGasQualityCertificateSchema2001Jul.xml">29</UCL>
<UCL xmlns="x-schema:../Schema/ChemGasQualityCertificateSchema2001Jul.xml">20</UCL>
</Root>
(请注意,我将您的预期输出包装在<Root>
标签中,否则,它将被视为格式不正确的.)
对于所有这些以及更多内容,请参阅推、拉、下一步! ,其中更详细地描述了每种方法的方面/优点,包括 Michael Kay 的看法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.