jbr*_*ehr 2 xml xslt xpath xslt-3.0
我有一个XML文档,其中包含如下结构的人员列表:
<listPerson>
<person xml:id="John_de_Foo">
<persName>
<forename>John</forename>
<nameLink>de</nameLink>
<surname>Foo</surname>
<role>snake charmer</role>
</persName>
</person>
<person xml:id="John_de_Foo_jr">
<persName>
<forename>John</forename>
<nameLink>de</nameLink>
<surname>Foo</surname>
<genname>junior</genname>
</persName>
</person>
<person xml:id="M_de_Foo">
<persName>
<forename>M</forename>
<nameLink>de</nameLink>
<surname>Foo</surname>
</persName>
</person>
[...]
</listPerson>
Run Code Online (Sandbox Code Playgroud)
我仅提取某些字段并将其与之连接tokenize()
以<fullname>
使用XSL 3.0(其中$ doc =当前文档)创建一个新元素:
<xsl:template match="listPerson/person">
<fullname>
<xsl:value-of select="$p/persName/name, $p/persName/forename, $p/persName/nameLink, $p/persName/surname, $p/persName/addName, $p/persName/genName" separator=" "/>
</fullname>
<xsl:template/>
Run Code Online (Sandbox Code Playgroud)
输出:
<fullname>John de Foo</fullname>
<fullname>John de Foo junior</fullname>
<fullname>M de Foo</fullname>
Run Code Online (Sandbox Code Playgroud)
但是,我想<forename>
通过特定的测试来处理该元素。如果forename/@text
是单个首字母,请添加.
。新结果将输出:
<fullname>John de Foo</fullname>
<fullname>John de Foo junior</fullname>
<fullname>M. de Foo</fullname>
Run Code Online (Sandbox Code Playgroud)
同样,该<forename>
元素可能不存在,在这种情况下,它应绕过测试。
我可以通过将更tokenize()
改为一系列<xsl:if>
语句来做到这一点,但我宁愿尝试在XPATH中解决它。
提前致谢
在XPath 2.0中,有一个if-then-else表达式,您可以xsl:value-of
像这样直接使用它:
<xsl:value-of select="$p/persName/name, if (string-length($p/persName/forename) = 1) then concat($p/persName/forename,'.') else $p/persName/forename , $p/persName/nameLink, $p/persName/surname, $p/persName/addName, $p/persName/genName" separator=" " />
Run Code Online (Sandbox Code Playgroud)
一种替代方法是在concat(...)
函数中使用if-then-else :
<xsl:value-of select="$p/persName/name, concat($p/persName/forename, if (string-length($p/persName/forename) = 1) then '.' else ''), $p/persName/nameLink, $p/persName/surname, $p/persName/addName, $p/persName/genName" separator=" " />
Run Code Online (Sandbox Code Playgroud)