我有一个类似于下面的xml,其中我有一个以“复数”命名的标签,其中包含一个以“singular”命名的标签数组。例如marketHierarchyLevels& marketHierarchyLevel,archiveLevels& archiveLevel。
我想使用xslt来识别这些模式并删除“复数”标记。这可以通过XSLT吗?
输入
<customer>
<marketReference>
<marketHierarchyLevels>
<marketHierarchyLevel>
<marketName>NATIONAL</marketName>
<level>0</level>
<marketId>1</marketId>
</marketHierarchyLevel>
<marketHierarchyLevel>
<marketName>WEST DIVISION</marketName>
<level>1</level>
<marketId>8211</marketId>
</marketHierarchyLevel>
</marketHierarchyLevels>
</marketReference>
<archiveReference>
<archiveLevels>
<archiveLevel>
<marketName>NATIONAL</marketName>
<level>0</level>
<marketId>1</marketId>
</archiveLevel>
<archiveLevel>
<marketName>WEST DIVISION</marketName>
<level>1</level>
<marketId>8211</marketId>
</archiveLevel>
</archiveLevels>
</archiveReference>
</customer>
预期输出
<customer>
<marketReference>
<marketHierarchyLevels>
<marketName>NATIONAL</marketName>
<level>0</level>
<marketId>1</marketId>
</marketHierarchyLevels>
<marketHierarchyLevels>
<marketName>WEST DIVISION</marketName>
<level>1</level>
<marketId>8211</marketId>
</marketHierarchyLevels>
</marketReference>
<archiveReference>
<archiveLevels>
<marketName>NATIONAL</marketName>
<level>0</level>
<marketId>1</marketId>
</archiveLevels>
<archiveLevels>
<marketName>WEST DIVISION</marketName>
<level>1</level>
<marketId>8211</marketId>
</archiveLevels>
</archiveReference>
</customer>
最新XSLT
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:m="http://xml.comcast.com/saleschannelmanagement/services"
xmlns:typ="http://xml.comcast.com/saleschannelmanagement/types">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="*[name() = concat(name(*), 's')]">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="*[concat(name(), 's') = name(..)]">
<xsl:element name="{name()}s">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:1)
- 根据更改的要求进行编辑 -
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[name() = concat(name(*), 's')]">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="*[concat(name(), 's') = name(..)]">
<xsl:element name="{name()}s">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
就个人而言,我更喜欢更安全的方法 - 虽然需要您知道传入XML的结构:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="marketHierarchyLevels | archiveLevels">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="marketHierarchyLevel | archiveLevel">
<xsl:element name="{name()}s">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>