我必须获取属性名称并根据 XSLT 中的名称执行一些操作。
源:
<group xlink:type="simple" xlink:href="XXX" xlink:title="sectionHeader_1" xmlns:xlink="http://www.w3.org/1999/xlink"></group>
<group xlink:type="simple" xlink:href="YYY" xlink:title="BodyParagraph_1" xmlns:xlink="http://www.w3.org/1999/xlink"></group>
<group xlink:type="simple" xlink:href="ZZZ" xlink:title="sectionHeader_2" xmlns:xlink="http://www.w3.org/1999/xlink"></group>
<group xlink:type="simple" xlink:href="AAA" xlink:title="sectionHeader_3" xmlns:xlink="http://www.w3.org/1999/xlink"></group>
<group xlink:type="simple" xlink:href="BBB" xlink:title="BodyParagraph_2" xmlns:xlink="http://www.w3.org/1999/xlink"></group>
<group xlink:type="simple" xlink:href="BBB" xlink:title="ConditionalText_2" xmlns:xlink="http://www.w3.org/1999/xlink"></group>
我必须获取其中的属性xlink:title
属性并检查以下内容:
- 当属性 xlink:title 包含字符串 sectionHeader 时,我需要做一些操作。
- 当属性 xlink:title 包含字符串 BodyParagraph,我需要一些操作。
- 当属性 xlink:title 包含字符串条件文本时,我需要进行一些操作。
谁能解释一下如何做到这一点?
XSLT 的精神是使用模板和模式匹配,以便最小化或完全消除显式条件指令。
以下是完成此操作的方法:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xlink="http://www.w3.org/1999/xlink">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="group">
<xsl:apply-templates select="@xlink:title"/>
</xsl:template>
<xsl:template match="@xlink:title[contains(., 'sectionHeader')]">
Found @xlink:title containing "sectionHeader"
</xsl:template>
<xsl:template match="@xlink:title[contains(., 'BodyParagraph')]">
Found @xlink:title containing "BodyParagraph"
</xsl:template>
<xsl:template match="@xlink:title[contains(., 'ConditionalText')]">
Found @xlink:title containing "ConditionalText"
</xsl:template>
</xsl:stylesheet>
在提供的 XML 片段(转换为格式正确的 XML 文档)上应用此转换时:
<t>
<group xlink:type="simple" xlink:href="XXX" xlink:title="sectionHeader_1" xmlns:xlink="http://www.w3.org/1999/xlink"></group>
<group xlink:type="simple" xlink:href="YYY" xlink:title="BodyParagraph_1" xmlns:xlink="http://www.w3.org/1999/xlink"></group>
<group xlink:type="simple" xlink:href="ZZZ" xlink:title="sectionHeader_2" xmlns:xlink="http://www.w3.org/1999/xlink"></group>
<group xlink:type="simple" xlink:href="AAA" xlink:title="sectionHeader_3" xmlns:xlink="http://www.w3.org/1999/xlink"></group>
<group xlink:type="simple" xlink:href="BBB" xlink:title="BodyParagraph_2" xmlns:xlink="http://www.w3.org/1999/xlink"></group>
<group xlink:type="simple" xlink:href="BBB" xlink:title="ConditionalText_2" xmlns:xlink="http://www.w3.org/1999/xlink"></group>
</t>
生成所需的结果(在每种情况下完成的操作):
Found @xlink:title containing "sectionHeader"
Found @xlink:title containing "BodyParagraph"
Found @xlink:title containing "sectionHeader"
Found @xlink:title containing "sectionHeader"
Found @xlink:title containing "BodyParagraph"
Found @xlink:title containing "ConditionalText"
请注意:您可以考虑使用 starts-with()
函数而不是 contains()
。
由于无法使用 XSLT 修改现有 XML 文件的某些部分,因此必须复制所有内容并更改应该不同的部分。因此,我建议编写一个默认复制每个节点的模板。然后,您可以为满足条件的组元素添加专用模板,例如:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xlink="http://www.w3.org/1999/xlink">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="group[contains(@xlink:title,'sectionHeader')]">
<group>
<xsl:copy-of select="@*"/>
<!-- modifications here -->
</group>
</xsl:template>
<xsl:template match="group[contains(@xlink:title,'BodyParagraph')]">
<group>
<xsl:copy-of select="@*"/>
<!-- modifications here -->
</group>
</xsl:template>
<xsl:template match="group[contains(@xlink:title,'ConditionalText')]">
<group>
<xsl:copy-of select="@*"/>
<!-- modifications here -->
</group>
</xsl:template>
</xsl:stylesheet>
如果还想更改属性值,只需将 xsl:copy-of 语句替换为所需的修改即可。
您的源 XML(已完成一些修改):
<?xml version="1.0"?>
<root>
<group id="x1" xlink:type="simple" xlink:href="XXX" xlink:title="sectionHeader_1" xmlns:xlink="http://www.w3.org/1999/xlink"></group>
<group id="x2" xlink:type="simple" xlink:href="YYY" xlink:title="BodyParagraph_1" xmlns:xlink="http://www.w3.org/1999/xlink"></group>
<group id="x3" xlink:type="simple" xlink:href="ZZZ" xlink:title="sectionHeader_2" xmlns:xlink="http://www.w3.org/1999/xlink"></group>
<group id="x4" xlink:type="simple" xlink:href="AAA" xlink:title="sectionHeader_3" xmlns:xlink="http://www.w3.org/1999/xlink"></group>
<group id="x5" xlink:type="simple" xlink:href="BBB" xlink:title="BodyParagraph_2" xmlns:xlink="http://www.w3.org/1999/xlink"></group>
<group id="x6" xlink:type="simple" xlink:href="BBB" xlink:title="ConditionalText_2" xmlns:xlink="http://www.w3.org/1999/xlink"></group>
<group id="x7" xlink:type="simple" xlink:href="BBB" xlink:title="some_other_2" xmlns:xlink="http://www.w3.org/1999/xlink"></group>
</root>
XSL 文档:
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink">
<xsl:template match="/">
<elements>
<xsl:apply-templates/>
</elements>
</xsl:template>
<xsl:template match="//group[(contains(@xlink:title,'sectionHeader') or contains(@xlink:title,'BodyParagraph') or contains(@xlink:title,'ConditionalText'))]">
<xsl:element name="element">
<xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute>
<xsl:attribute name="type"><xsl:value-of select="@xlink:type"/></xsl:attribute>
<xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
结果是:
<?xml version='1.0' ?>
<elements xmlns:xlink="http://www.w3.org/1999/xlink">
<element id="x1" type="simple" href="XXX"/>
<element id="x2" type="simple" href="YYY"/>
<element id="x3" type="simple" href="ZZZ"/>
<element id="x4" type="simple" href="AAA"/>
<element id="x5" type="simple" href="BBB"/>
<element id="x6" type="simple" href="BBB"/>
</elements>