如何匹配父元素中的特定文本 - 添加名称相同但文本不同的新子元素
How to match a specific text in parent element - adding new child elements with same name, but different text
我只是想不通我是如何能够匹配指定文本的。
所以我有以下 xml-数据。我想根据频道添加更多显示名称。
<?xml version="1.0" encoding="UTF-8" ?>
<!-- EPG XMLTV FILE CREATED BY Take-a-LUG TEAM- (c) 2020 Bastian Kleinschmidt -->
<!-- created on 2022-01-09 23:17:01.019522 -->
<tv generator-info-name="Takealug EPG Grabber Ver. 1.1.2+matrix" generator-info-url="https://github.com/DeBaschdi/service.takealug.epg-grabber">
<channel id="ARD.de">
<display-name lang="de">Das Erste</display-name>
</channel>
<channel id="ZDF.de">
<display-name lang="de">ZDF</display-name>
</channel>
<channel id="RTL.de">
<display-name lang="de">RTL</display-name>
</channel>
<channel id="Sat1.de">
<display-name lang="de">SAT.1</display-name>
</channel>
<channel id="Pro7.de">
<display-name lang="de">ProSieben</display-name>
</channel>
<channel id="Kabel.de">
<display-name lang="de">kabel eins</display-name>
</channel>
</tv>
如您所见,我为每个频道指定了频道 ID 和显示名称。现在我想要f.e。除了 <display-name>Das Erste</display-name>
,还有 <display-name>Das Erste HD</display-name>
。对于 ZDF、ZDF HD,或 'Kabel Eins' HD 后缀 auch 'Kabel 1' 作为显示名称。还有一些其他频道我想做一些调整。
我尝试了一些东西,f.e.:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="channel/display-name[contains('Das Erste')]">
<xsl:copy>
<display-name>Das Erste HD</display-name>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
但是没有任何反应,所以我认为解决方案的关键是匹配正确的频道。
变化:
<xsl:template match="channel/display-name[contains('Das Erste')]">
至:
<xsl:template match="channel[contains(display-name, 'Das Erste')]">
参见:
https://www.w3.org/TR/1999/REC-xpath-19991116/#predicates
https://www.w3.org/TR/1999/REC-xpath-19991116/#function-contains
我只是想不通我是如何能够匹配指定文本的。 所以我有以下 xml-数据。我想根据频道添加更多显示名称。
<?xml version="1.0" encoding="UTF-8" ?>
<!-- EPG XMLTV FILE CREATED BY Take-a-LUG TEAM- (c) 2020 Bastian Kleinschmidt -->
<!-- created on 2022-01-09 23:17:01.019522 -->
<tv generator-info-name="Takealug EPG Grabber Ver. 1.1.2+matrix" generator-info-url="https://github.com/DeBaschdi/service.takealug.epg-grabber">
<channel id="ARD.de">
<display-name lang="de">Das Erste</display-name>
</channel>
<channel id="ZDF.de">
<display-name lang="de">ZDF</display-name>
</channel>
<channel id="RTL.de">
<display-name lang="de">RTL</display-name>
</channel>
<channel id="Sat1.de">
<display-name lang="de">SAT.1</display-name>
</channel>
<channel id="Pro7.de">
<display-name lang="de">ProSieben</display-name>
</channel>
<channel id="Kabel.de">
<display-name lang="de">kabel eins</display-name>
</channel>
</tv>
如您所见,我为每个频道指定了频道 ID 和显示名称。现在我想要f.e。除了 <display-name>Das Erste</display-name>
,还有 <display-name>Das Erste HD</display-name>
。对于 ZDF、ZDF HD,或 'Kabel Eins' HD 后缀 auch 'Kabel 1' 作为显示名称。还有一些其他频道我想做一些调整。
我尝试了一些东西,f.e.:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="channel/display-name[contains('Das Erste')]">
<xsl:copy>
<display-name>Das Erste HD</display-name>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
但是没有任何反应,所以我认为解决方案的关键是匹配正确的频道。
变化:
<xsl:template match="channel/display-name[contains('Das Erste')]">
至:
<xsl:template match="channel[contains(display-name, 'Das Erste')]">
参见:
https://www.w3.org/TR/1999/REC-xpath-19991116/#predicates
https://www.w3.org/TR/1999/REC-xpath-19991116/#function-contains