Xml XSLT2.0测试以特定值开头的元素名称
我环顾了一下四周,但我没有看到我的问题的明显答案。我肯定我忽略了什么,但我不知道是什么 我已经对下面的XML做了一些预处理来编辑一些元素名称,在预处理之后,我有了一个XSL样式表,可以进行简单的标识转换。但是,我想知道是否有一种方法可以避免预处理步骤并在一个样式表中完成所有工作。两个XML输入之间的主要区别是Xml XSLT2.0测试以特定值开头的元素名称,xml,xslt,xslt-2.0,Xml,Xslt,Xslt 2.0,我环顾了一下四周,但我没有看到我的问题的明显答案。我肯定我忽略了什么,但我不知道是什么 我已经对下面的XML做了一些预处理来编辑一些元素名称,在预处理之后,我有了一个XSL样式表,可以进行简单的标识转换。但是,我想知道是否有一种方法可以避免预处理步骤并在一个样式表中完成所有工作。两个XML输入之间的主要区别是已变成 有没有一种方法可以测试元素名的起始值(我想也是结束值)?非常感谢您的时间和建议 我有如下的XML输入: <?xml version="1.0" encoding="UTF-8"
已变成
有没有一种方法可以测试元素名的起始值(我想也是结束值)?非常感谢您的时间和建议
我有如下的XML输入:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<row>
<issueNumber>1.001</issueNumber>
<subj1>Cats</subj1>
<subj2>LOLCats</subj2>
<subj3>Cheezburgers</subj3>
<subj4></subj4>
</row>
<row>
<issueNumber>2.001</issueNumber>
<subj1>Cats</subj1>
<subj2>LOLCats</subj2>
<subj3>NOMS</subj3>
<subj4>Cheezburger</subj4>
</row>
<row>
<issueNumber>3.001</issueNumber>
<subj1>NOMS</subj1>
<subj2></subj2>
<subj3></subj3>
<subj4></subj4>
</row>
</root>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[starts-with(name(),'subj')]">
<subj>
<xsl:if test="string(.)">
<subject>
<xsl:apply-templates/>
</subject>
</xsl:if>
</subj>
</xsl:template>
</xsl:stylesheet>
1.001
猫
萌猫
芝士汉堡
2.001
猫
萌猫
名字
芝士汉堡
3.001
名字
我使用以下XSL处理它:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="row">
<!--<xsl:result-document href="{concat(issueNumber, '.xml')}">-->
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
<!--</xsl:result-document>-->
</xsl:template>
<xsl:template match="issueNumber">
<xsl:copy>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<xsl:template match="subj">
<xsl:choose>
<xsl:when test="not(string(.))"></xsl:when>
<xsl:when test="string(.)">
<subject>
<xsl:apply-templates />
</subject>
</xsl:when>
</xsl:choose>
</xsl:template>
您是否在XSLT中搜索类似“regex”的内容?如果您是,此链接可能对您非常有用:
但是,此解决方案仅适用于XSLT2.0。您可能会失去与旧XSLT版本的兼容性。如果我正确理解了这个问题,您可以这样做:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<row>
<issueNumber>1.001</issueNumber>
<subj1>Cats</subj1>
<subj2>LOLCats</subj2>
<subj3>Cheezburgers</subj3>
<subj4></subj4>
</row>
<row>
<issueNumber>2.001</issueNumber>
<subj1>Cats</subj1>
<subj2>LOLCats</subj2>
<subj3>NOMS</subj3>
<subj4>Cheezburger</subj4>
</row>
<row>
<issueNumber>3.001</issueNumber>
<subj1>NOMS</subj1>
<subj2></subj2>
<subj3></subj3>
<subj4></subj4>
</row>
</root>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[starts-with(name(),'subj')]">
<subj>
<xsl:if test="string(.)">
<subject>
<xsl:apply-templates/>
</subject>
</xsl:if>
</subj>
</xsl:template>
</xsl:stylesheet>
使用XML输入(已更正为格式正确):
1.001
猫
萌猫
芝士汉堡
2.001
猫
萌猫
名字
芝士汉堡
3.001
名字
生成以下输出:
<root>
<row>
<issueNumber>1.001</issueNumber>
<subj>
<subject>Cats</subject>
</subj>
<subj>
<subject>LOLCats</subject>
</subj>
<subj>
<subject>Cheezburgers</subject>
</subj>
<subj/>
</row>
<row>
<issueNumber>2.001</issueNumber>
<subj>
<subject>Cats</subject>
</subj>
<subj>
<subject>LOLCats</subject>
</subj>
<subj>
<subject>NOMS</subject>
</subj>
<subj>
<subject>Cheezburger</subject>
</subj>
</row>
<row>
<issueNumber>3.001</issueNumber>
<subj>
<subject>NOMS</subject>
</subj>
<subj/>
<subj/>
<subj/>
</row>
</root>
1.001
猫
萌猫
芝士汉堡
2.001
猫
萌猫
名字
芝士汉堡
3.001
名字
谢谢,多米尼克!问题不在于正则表达式,而在于如何正确使用xsl:template match=“…”
中的start-with()
。此外,感谢指向规范的链接,它很好地提醒了我们可以使用什么。今年,规范通常是最好的参考。我编辑了XML输入,间隔的
不够远,对此表示抱歉。您的样式表最接近于xsl:template match=“*[以…]开头]”
的简洁用法。非常感谢你的帮助!