使用 XSL 从 XSD 中提取顶级元素名称属性
Extract Top level Elements Name attribute from XSD using XSL
我需要提取根元素名称属性我的输入如下
<?xml version = '1.0' encoding = 'UTF-8'?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns:nxsd="http://xmlns" nxsd:encoding="US-ASCII">
<xsd:element name="car">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="wheel" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:annotation>
<xsd:appinfo>NXSDSAMPLE=</xsd:appinfo>
<xsd:appinfo>USEHEADER=false</xsd:appinfo>
</xsd:annotation>
</xsd:schema>
XSL 如下所示
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="/*/*[local-name()='element']">
<xsl:value-of select="@name"></xsl:value-of>
</xsl:template>
</xsl:stylesheet>
所需的输出仅为 "car",但转换正在生成
NXSDSAMPLE=
USEHEADER=false
car
我的程序如下所示
Document document;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
StringWriter sw = new StringWriter();
File rootNameStyleSheet = new File("RootElementNameExtractor.xsl");
File datafile = new File("cf1.xsd");
try {
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse(datafile);
TransformerFactory tFactory = TransformerFactory.newInstance();
StreamSource stylesource = new StreamSource(rootNameStyleSheet);
Transformer transformer = tFactory.newTransformer(stylesource);
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.setOutputProperty(OutputKeys.INDENT, indent);
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(sw);
transformer.transform(source, result);
}
任何有关 XSL 错误的意见都会有所帮助
有内置模板可确保处理从根节点开始,然后将进一步的模板应用于子节点。这样你的模板最终会被使用,但你的其他输入节点也会被内置模板处理。
你有两个选择,要么添加
<xsl:template match="/">
<xsl:apply-templates select="xsd:schema/xsd:element"/>
</xsl:template>
(假设您的样式表声明 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
)或确保您使用
覆盖文本节点输出的内置模板
<xsl:template match="text()"/>
我会写一个简单的样式表
<xsl:template match="/">
<xsl:value-of select="/*/xsd:element[1]/@name"/>
</xsl:template>
我需要提取根元素名称属性我的输入如下
<?xml version = '1.0' encoding = 'UTF-8'?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns:nxsd="http://xmlns" nxsd:encoding="US-ASCII">
<xsd:element name="car">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="wheel" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:annotation>
<xsd:appinfo>NXSDSAMPLE=</xsd:appinfo>
<xsd:appinfo>USEHEADER=false</xsd:appinfo>
</xsd:annotation>
</xsd:schema>
XSL 如下所示
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="/*/*[local-name()='element']">
<xsl:value-of select="@name"></xsl:value-of>
</xsl:template>
</xsl:stylesheet>
所需的输出仅为 "car",但转换正在生成
NXSDSAMPLE=
USEHEADER=false
car
我的程序如下所示
Document document;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
StringWriter sw = new StringWriter();
File rootNameStyleSheet = new File("RootElementNameExtractor.xsl");
File datafile = new File("cf1.xsd");
try {
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse(datafile);
TransformerFactory tFactory = TransformerFactory.newInstance();
StreamSource stylesource = new StreamSource(rootNameStyleSheet);
Transformer transformer = tFactory.newTransformer(stylesource);
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.setOutputProperty(OutputKeys.INDENT, indent);
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(sw);
transformer.transform(source, result);
}
任何有关 XSL 错误的意见都会有所帮助
有内置模板可确保处理从根节点开始,然后将进一步的模板应用于子节点。这样你的模板最终会被使用,但你的其他输入节点也会被内置模板处理。
你有两个选择,要么添加
<xsl:template match="/">
<xsl:apply-templates select="xsd:schema/xsd:element"/>
</xsl:template>
(假设您的样式表声明 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
)或确保您使用
<xsl:template match="text()"/>
我会写一个简单的样式表
<xsl:template match="/">
<xsl:value-of select="/*/xsd:element[1]/@name"/>
</xsl:template>