Xml 限制XSLT文本提取到特定字段
对XSLT来说还是相当陌生的;我试图使用XSLT(1.0)从XML文件中提取某些字段,并且仅提取某些字段。下面是实际XML文档的简化形式:Xml 限制XSLT文本提取到特定字段,xml,xslt,text,extraction,Xml,Xslt,Text,Extraction,对XSLT来说还是相当陌生的;我试图使用XSLT(1.0)从XML文件中提取某些字段,并且仅提取某些字段。下面是实际XML文档的简化形式: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Transaction> <TradeMarkTransactionBody> <TransactionContentDetails> <TransactionCode
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Transaction>
<TradeMarkTransactionBody>
<TransactionContentDetails>
<TransactionCode>National Trademark Information</TransactionCode>
<TransactionData>
<TradeMarkDetails>
<TradeMark>
<RegistrationOfficeCode>US</RegistrationOfficeCode>
<ApplicationNumber>74631225</ApplicationNumber>
<ApplicationDate>1995-02-07-05:00</ApplicationDate>
<RegistrationNumber>2178784</RegistrationNumber>
<RegistrationDate>1998-08-04-04:00</RegistrationDate>
<FilingPlace>US</FilingPlace>
<MarkCurrentStatusDate>2008-08-11-04:00</MarkCurrentStatusDate>
<WordMarkSpecification>
<MarkVerbalElementText>JAVA </MarkVerbalElementText>
</WordMarkSpecification>
</TradeMark>
</TradeMarkDetails>
</TransactionData>
</TransactionContentDetails>
</TradeMarkTransactionBody>
</Transaction>
我的问题:1)如何避免拾取不需要的数据,如输出中的TransactionCode
(“国家商标信息
”);2)如何避免<代码>到期日期>代码>和<代码> MaqValBeleTimeTe> <代码>之间的空行?(我已经确认它不是XSLT文件中的空行;将它们排除在外并不起作用。)
(我怀疑这两个问题可能只有一个答案;不知何故,我保留了未选中的
markorbalElementText
text,以及一些未选中的换行符。)你就快到了。您的第一个模板“消耗”了整个文档,如果您只需要商标
标记,只需将其应用于感兴趣的标记即可
<xsl:template match="Transaction">
<xsl:apply-templates select=".//TradeMark"/>
</xsl:template>
这里对提供的转换进行了轻微的修改和简化(删除了一个不必要的模板)——现在生成了所需的正确结果:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8" />
<xsl:strip-space elements="*"/>
<xsl:template match="TradeMark">
MarkCurrentStatusDate,"<xsl:value-of select="MarkCurrentStatusDate"/>"
ApplicationNumber,"<xsl:value-of select="ApplicationNumber"/>"
ApplicationDate,"<xsl:value-of select="ApplicationDate"/>"
RegistrationNumber,"<xsl:value-of select="RegistrationNumber"/>"
RegistrationDate,"<xsl:value-of select="RegistrationDate"/>"
ExpirationDate,"<xsl:value-of select="ExpirationDate"/><xsl:text>"</xsl:text>
<xsl:apply-templates select="WordMarkSpecification"/>
</xsl:template>
<xsl:template match="WordMarkSpecification">
MarkVerbalElementText,"<xsl:value-of select="normalize-space(MarkVerbalElementText)"/>"
</xsl:template>
<xsl:template match="TransactionCode"/>
</xsl:stylesheet>
说明:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8" />
<xsl:strip-space elements="*"/>
<xsl:template match="TradeMark">
MarkCurrentStatusDate,"<xsl:value-of select="MarkCurrentStatusDate"/>"
ApplicationNumber,"<xsl:value-of select="ApplicationNumber"/>"
ApplicationDate,"<xsl:value-of select="ApplicationDate"/>"
RegistrationNumber,"<xsl:value-of select="RegistrationNumber"/>"
RegistrationDate,"<xsl:value-of select="RegistrationDate"/>"
ExpirationDate,"<xsl:value-of select="ExpirationDate"/><xsl:text>"</xsl:text>
<xsl:apply-templates select="WordMarkSpecification"/>
</xsl:template>
<xsl:template match="WordMarkSpecification">
MarkVerbalElementText,"<xsl:value-of select="normalize-space(MarkVerbalElementText)"/>"
</xsl:template>
<xsl:template match="TransactionCode"/>
</xsl:stylesheet>
用于重写与元素匹配的XSLT内置模板,该模板生成匹配元素的所有文本节点子体的串联“
可防止以下新行字符被解释为所需输出的一部分,从而消除观察到的空行事务的模板将被删除,因为它的行为与匹配元素的XSLT内置模板完全相同——将模板应用于其所有子元素
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:util="urn:util">
<xsl:output
method="text"
encoding="utf-8"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="fields" select="document('')/*/util:fields"/>
<util:fields>
<field>MarkCurrentStatusDate</field>
<field>ApplicationNumber</field>
<field>ApplicationDate</field>
<field>RegistrationNumber</field>
<field>RegistrationDate</field>
<field>ExpirationDate</field>
<field>MarkVerbalElementText</field>
</util:fields>
<xsl:template match="/">
<xsl:variable name="xml" select="."/>
<xsl:for-each select="$fields/field">
<xsl:variable name="f" select="."/>
<xsl:value-of select="$f"/>
<xsl:text>="</xsl:text>
<xsl:value-of select="normalize-space($xml//TradeMark//*[local-name() = $f])"/>
<xsl:text>"
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
我不太相信它能超过您提供的示例XML,但它确实在那里起作用。非常感谢。我发现它解决了提取问题,并进行了一些实验(我从XSLT手册中提取,但必须仔细阅读才能理解),也能去掉空白。谢谢。我将比较两个答案(两个都有效)并希望更好地理解这些方法。我发现我实际上有3个空行,但通过在每个模板的MarkCurrentStatusDate选择的开始和最后一个选择的结束处放置,我能够抑制所有。Dimitre,如果我理解你建议的方法,我需要指定不提取的元素,对吗?因为这是一个简化的示例,在一个包含许多其他元素的更完整的示例中,我需要为每个元素添加一个空模板,对吗?@user1564935,不客气。您接受的答案不能解决您的空行问题。此外,它是“拉式”的,而这个答案是纯“推式”的。建议使用“推式”转换拉式“由于更大的灵活性/可扩展性/可维护性而导致的错误。@user1564935,不,在大多数情况下,您可以组合任何一组元素名称,并在单个模板中指定它们。但我要忽略的每个元素都必须标识,对吗?”?在非简化的情况下会有点毛茸茸的。实际上,我扔掉了大约80%的数据,只保留了一些数据。
<Transaction>
<TradeMarkTransactionBody>
<TransactionContentDetails>
<TransactionCode>National Trademark Information</TransactionCode>
<TransactionData>
<TradeMarkDetails>
<TradeMark>
<RegistrationOfficeCode>US</RegistrationOfficeCode>
<ApplicationNumber>74631225</ApplicationNumber>
<ApplicationDate>1995-02-07-05:00</ApplicationDate>
<RegistrationNumber>2178784</RegistrationNumber>
<RegistrationDate>1998-08-04-04:00</RegistrationDate>
<FilingPlace>US</FilingPlace>
<MarkCurrentStatusDate>2008-08-11-04:00</MarkCurrentStatusDate>
<WordMarkSpecification>
<MarkVerbalElementText>JAVA </MarkVerbalElementText>
</WordMarkSpecification>
</TradeMark>
</TradeMarkDetails>
</TransactionData>
</TransactionContentDetails>
</TradeMarkTransactionBody>
</Transaction>
MarkCurrentStatusDate,"2008-08-11-04:00"
ApplicationNumber,"74631225"
ApplicationDate,"1995-02-07-05:00"
RegistrationNumber,"2178784"
RegistrationDate,"1998-08-04-04:00"
ExpirationDate,""
MarkVerbalElementText,"JAVA"
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:util="urn:util">
<xsl:output
method="text"
encoding="utf-8"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="fields" select="document('')/*/util:fields"/>
<util:fields>
<field>MarkCurrentStatusDate</field>
<field>ApplicationNumber</field>
<field>ApplicationDate</field>
<field>RegistrationNumber</field>
<field>RegistrationDate</field>
<field>ExpirationDate</field>
<field>MarkVerbalElementText</field>
</util:fields>
<xsl:template match="/">
<xsl:variable name="xml" select="."/>
<xsl:for-each select="$fields/field">
<xsl:variable name="f" select="."/>
<xsl:value-of select="$f"/>
<xsl:text>="</xsl:text>
<xsl:value-of select="normalize-space($xml//TradeMark//*[local-name() = $f])"/>
<xsl:text>"
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
MarkCurrentStatusDate="2008-08-11-04:00"
ApplicationNumber="74631225"
ApplicationDate="1995-02-07-05:00"
RegistrationNumber="2178784"
RegistrationDate="1998-08-04-04:00"
ExpirationDate=""
MarkVerbalElementText="JAVA"