Xml 消除元素
我有这个xml文档:Xml 消除元素,xml,xslt,Xml,Xslt,我有这个xml文档: <tags> <w lemme="déclaration" pos="NOM">Déclaration</w> <w lemme="du" pos="PRP:det">des</w> <w lemme="droit" pos="NOM">droits</w> <w lemme="de" pos="PRP">de</w> <w lemme="le" pos="DE
<tags>
<w lemme="déclaration" pos="NOM">Déclaration</w>
<w lemme="du" pos="PRP:det">des</w>
<w lemme="droit" pos="NOM">droits</w>
<w lemme="de" pos="PRP">de</w>
<w lemme="le" pos="DET:ART">l'</w>
<w lemme="homme" pos="NOM">homme</w>
<w lemme="et" pos="KON">et</w>
<w lemme="," pos="PUN">,</w>
...
</tags>
声明
des
所有权
判定元件
我是
霍姆
et
,
...
我试图使用xsl过滤掉文章和标点符号。比如这里的<xsl:template match="*">
<xsl:choose>
<xsl:when test="contains(@pos,'PUN')"></xsl:when>
<xsl:when test="contains(@pos,'PRP')"></xsl:when>
<xsl:when test="contains(@pos,'DET')"></xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:attribute name="lemme">
<xsl:value-of select="@lemme"/>
</xsl:attribute>
<xsl:attribute name="pos">
<xsl:value-of select="@pos"/>
</xsl:attribute>
<xsl:apply-templates/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
我有一个结果:
<tags lemme="" pos="">
<w lemme="déclaration" pos="NOM">Déclaration</w>
<w lemme="droit" pos="NOM">droits</w>
<w lemme="homme" pos="NOM">homme</w>
<w lemme="et" pos="KON">et</w>
<w lemme="citoyen" pos="NOM">citoyen</w>
声明
所有权
霍姆
et
公民
所以它可以工作,只显示我感兴趣的行,只是我不希望它也在第一行的
<xsl:template match="/tags">
<xsl:copy>
<xsl:apply-templates select="w"/>
</xsl:copy>
</xsl:template>
对于第二位,将当前模板更改为:
<xsl:template match="w">
为清晰起见,以下是完整的样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:template match="/tags">
<xsl:copy>
<xsl:apply-templates select="w"/>
</xsl:copy>
</xsl:template>
<xsl:template match="w">
<xsl:choose>
<xsl:when test="contains(@pos,'PUN')"></xsl:when>
<xsl:when test="contains(@pos,'PRP')"></xsl:when>
<xsl:when test="contains(@pos,'DET')"></xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:attribute name="lemme">
<xsl:value-of select="@lemme"/>
</xsl:attribute>
<xsl:attribute name="pos">
<xsl:value-of select="@pos"/>
</xsl:attribute>
<xsl:apply-templates/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
这将产生预期的结果:
<?xml version="1.0" encoding="utf-8"?>
<tags>
<w lemme="déclaration" pos="NOM">Déclaration</w>
<w lemme="droit" pos="NOM">droits</w>
<w lemme="homme" pos="NOM">homme</w>
<w lemme="et" pos="KON">et</w>
</tags>
声明
所有权
霍姆
et
希望这能有所帮助。有几种方法可以解决这个问题,但是一种方法可以增强您已经拥有的功能,就是让一个规则匹配并输出tags元素,然后应用第二个模板只匹配w元素 对于第一位,将此模板添加到现有模板之前:
<xsl:template match="/tags">
<xsl:copy>
<xsl:apply-templates select="w"/>
</xsl:copy>
</xsl:template>
对于第二位,将当前模板更改为:
<xsl:template match="w">
为清晰起见,以下是完整的样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:template match="/tags">
<xsl:copy>
<xsl:apply-templates select="w"/>
</xsl:copy>
</xsl:template>
<xsl:template match="w">
<xsl:choose>
<xsl:when test="contains(@pos,'PUN')"></xsl:when>
<xsl:when test="contains(@pos,'PRP')"></xsl:when>
<xsl:when test="contains(@pos,'DET')"></xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:attribute name="lemme">
<xsl:value-of select="@lemme"/>
</xsl:attribute>
<xsl:attribute name="pos">
<xsl:value-of select="@pos"/>
</xsl:attribute>
<xsl:apply-templates/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
这将产生预期的结果:
<?xml version="1.0" encoding="utf-8"?>
<tags>
<w lemme="déclaration" pos="NOM">Déclaration</w>
<w lemme="droit" pos="NOM">droits</w>
<w lemme="homme" pos="NOM">homme</w>
<w lemme="et" pos="KON">et</w>
</tags>
声明
所有权
霍姆
et
希望这有帮助。您应该使用标准的身份转换,即以下模板:
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
您始终可以使用它将所有内容从源复制到输出。异常由额外的模板处理,例如:
<xsl:template match="w[contains(@pos,'PUN')]
|w[contains(@pos,'PRP')]
|w[contains(@pos,'DET')]"/>
这没什么用。它只是匹配不需要的元素,并防止标识转换模板匹配和复制它们。完整样式表如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="w[contains(@pos,'PUN')]
|w[contains(@pos,'PRP')]
|w[contains(@pos,'DET')]"/>
</xsl:stylesheet>
您应该使用标准标识转换,即以下模板:
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
您始终可以使用它将所有内容从源复制到输出。异常由额外的模板处理,例如:
<xsl:template match="w[contains(@pos,'PUN')]
|w[contains(@pos,'PRP')]
|w[contains(@pos,'DET')]"/>
这没什么用。它只是匹配不需要的元素,并防止标识转换模板匹配和复制它们。完整样式表如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="w[contains(@pos,'PUN')]
|w[contains(@pos,'PRP')]
|w[contains(@pos,'DET')]"/>
</xsl:stylesheet>
您能重新格式化您的问题吗?你的代码块不可读…是的,对不起,现在更好了,我想你能重新格式化你的问题吗?你的代码块不可读…是的,对不起,现在好多了,我想谢谢你的回答。问题是我确实希望它们成为输出的一部分,但只在