我有一个需求,我想根据条件从xml中删除一些标签。
这是我的输入xml:
<?xml version="1.0" encoding="UTF-8"?>
<TCXML xmlns="http://www.tcxml.org/Schemas/TCXMLSchema">
<File creation_date="2012-09-20T07:28:47Z" elemId="id280" exportedFileName="sheet 1" last_mod_date="2012-09-20T07:28:48Z" text_flag="8192">
<GSIdentity elemId="id111" label="R0dB1SzBBT4jNA"/>
</File>
<File creation_date="2012-09-20T07:18:26Z" elemId="id283"exportedFileName="test part" last_mod_date="2012-09-20T07:18:26Z" text_flag="8192">
<GSIdentity elemId="id31" label="SIWBFqLyBT4jNA"/>
</File>
<File creation_date="2012-09-20T07:21:03Z" elemId="id322" exportedFileName="test part3" last_mod_date="2012-09-20T07:21:03Z" text_flag="8192">
<GSIdentity elemId="id46" label="ycUBFqLyBT4jNA"/>
</File>
<File creation_date="2012-09-20T07:18:25Z" elemId="id285" exportedFileName="test part2" last_mod_date="2012-09-20T07:18:25Z" text_flag="4096">
<GSIdentity elemId="id29" label="SQRBFqLyBT4jNA"/>
</File>
<Sheet creation_date="2012-09-20T07:28:48Z" date_released="" ead_paragraph="" elemId="id185" keep_limit_prop="3" last_mod_date="2012-09-20T07:28:48Z" object_desc="" object_name="Sheet 1" ref_list="#id111">
<GSIdentity elemId="id112" label="R4WB1SzBBT4jNA"/>
</Sheet>
<PART creation_date="2012-09-20T07:21:22Z" date_released="" ead_paragraph="" elemId="id435" keep_limit_prop="3" last_mod_date="2012-09-20T07:21:28Z" object_name="dwgTest-AA-dwg1" ref_list="#id29 #id31">
<GSIdentity elemId="id32" label="SxZBFqLyBT4jNA"/>
</PART>
<PART creation_date="2012-09-20T07:21:23Z" date_released="2012-09-20T07:21:27Z" ead_paragraph="" elemId="id438" keep_limit_prop="3" last_mod_date="2012-09-20T07:21:29Z" object_name="dwgTest-AA-dwg2" ref_list="#id46">
<GSIdentity elemId="id21" label="itfBFqLyBT4jNA"/>
</PART>
</TCXML>
我想从这个xml中删除这些文件标签,这些标签在PART中引用了ref_list标签。
我正在尝试使用以下xsl,
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:plm="http://www.tcxml.org/Schemas/TCXMLSchema" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="plm:File">
<xsl:variable name="Ref_List" select="translate(/plm:TCXML/plm:PART/@ref_list,' ','')" />
<xsl:variable name="currentElementGSId" select="plm:GSIdentity/@elemId" />
<xsl:variable name="RefcurrentElementGSId" select="concat(string('#'),$currentElementGSId)" />
<xsl:choose>
<xsl:when test="((contains($Ref_List,$RefcurrentElementGSId))=true())" >
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
上面的xsl仅适用于xml中的一个PART而不是xml中的所有PART标签,如何循环遍历xml中的所有PART标签。 感谢您的帮助。
我正在寻找这个xml的输出,如下所示,
<?xml version="1.0" encoding="UTF-8"?>
<TCXML xmlns="http://www.tcxml.org/Schemas/TCXMLSchema">
<File creation_date="2012-09-20T07:28:47Z" elemId="id280" exportedFileName="sheet 1" last_mod_date="2012-09-20T07:28:48Z" text_flag="8192">
<GSIdentity elemId="id111" label="R0dB1SzBBT4jNA"/>
</File>
<Sheet creation_date="2012-09-20T07:28:48Z" date_released="" ead_paragraph="" elemId="id185" keep_limit_prop="3" last_mod_date="2012-09-20T07:28:48Z" object_desc="" object_name="Sheet 1" ref_list="#id111">
<GSIdentity elemId="id112" label="R4WB1SzBBT4jNA"/>
</Sheet>
<PART creation_date="2012-09-20T07:21:22Z" date_released="" ead_paragraph="" elemId="id435" keep_limit_prop="3" last_mod_date="2012-09-20T07:21:28Z" object_name="dwgTest-AA-dwg1" ref_list="#id29 #id31">
<GSIdentity elemId="id32" label="SxZBFqLyBT4jNA"/>
</PART>
<PART creation_date="2012-09-20T07:21:23Z" date_released="2012-09-20T07:21:27Z" ead_paragraph="" elemId="id438" keep_limit_prop="3" last_mod_date="2012-09-20T07:21:29Z" object_name="dwgTest-AA-dwg2" ref_list="#id46">
<GSIdentity elemId="id21" label="itfBFqLyBT4jNA"/>
</PART>
</TCXML>
答案 0 :(得分:2)
更短更简单,最重要的是:正确的解决方案:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="http://www.tcxml.org/Schemas/TCXMLSchema">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="x:File">
<xsl:if test=
"not(/*/x:PART/@ref_list
[contains(concat(.,' '),
concat('#',
current()/x:GSIdentity/@elemId,
' ')
)
])">
<xsl:call-template name="identity"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<TCXML xmlns="http://www.tcxml.org/Schemas/TCXMLSchema">
<File creation_date="2012-09-20T07:28:47Z" elemId="id280"
exportedFileName="sheet 1" last_mod_date="2012-09-20T07:28:48Z"
text_flag="8192">
<GSIdentity elemId="id111" label="R0dB1SzBBT4jNA"/>
</File>
<File creation_date="2012-09-20T07:18:26Z" elemId="id283"
exportedFileName="test part" last_mod_date="2012-09-20T07:18:26Z"
text_flag="8192">
<GSIdentity elemId="id31" label="SIWBFqLyBT4jNA"/>
</File>
<File creation_date="2012-09-20T07:21:03Z" elemId="id322"
exportedFileName="test part3" last_mod_date="2012-09-20T07:21:03Z"
text_flag="8192">
<GSIdentity elemId="id46" label="ycUBFqLyBT4jNA"/>
</File>
<File creation_date="2012-09-20T07:18:25Z" elemId="id285"
exportedFileName="test part2" last_mod_date="2012-09-20T07:18:25Z"
text_flag="4096">
<GSIdentity elemId="id29" label="SQRBFqLyBT4jNA"/>
</File>
<Sheet creation_date="2012-09-20T07:28:48Z" date_released=""
ead_paragraph="" elemId="id185" keep_limit_prop="3"
last_mod_date="2012-09-20T07:28:48Z" object_desc=""
object_name="Sheet 1" ref_list="#id111">
<GSIdentity elemId="id112" label="R4WB1SzBBT4jNA"/>
</Sheet>
<PART creation_date="2012-09-20T07:21:22Z" date_released=""
ead_paragraph="" elemId="id435" keep_limit_prop="3"
last_mod_date="2012-09-20T07:21:28Z" object_name="dwgTest-AA-dwg1"
ref_list="#id29 #id31">
<GSIdentity elemId="id32" label="SxZBFqLyBT4jNA"/>
</PART>
<PART creation_date="2012-09-20T07:21:23Z" date_released="2012-09-20T07:21:27Z"
ead_paragraph="" elemId="id438" keep_limit_prop="3"
last_mod_date="2012-09-20T07:21:29Z" object_name="dwgTest-AA-dwg2"
ref_list="#id46">
<GSIdentity elemId="id21" label="itfBFqLyBT4jNA"/>
</PART>
</TCXML>
产生了想要的,正确的结果(4个文件元素中的3个被“删除”):
<TCXML xmlns="http://www.tcxml.org/Schemas/TCXMLSchema">
<File creation_date="2012-09-20T07:28:47Z" elemId="id280" exportedFileName="sheet 1" last_mod_date="2012-09-20T07:28:48Z" text_flag="8192">
<GSIdentity elemId="id111" label="R0dB1SzBBT4jNA"/>
</File>
<Sheet creation_date="2012-09-20T07:28:48Z" date_released="" ead_paragraph="" elemId="id185" keep_limit_prop="3" last_mod_date="2012-09-20T07:28:48Z" object_desc="" object_name="Sheet 1" ref_list="#id111">
<GSIdentity elemId="id112" label="R4WB1SzBBT4jNA"/>
</Sheet>
<PART creation_date="2012-09-20T07:21:22Z" date_released="" ead_paragraph="" elemId="id435" keep_limit_prop="3" last_mod_date="2012-09-20T07:21:28Z" object_name="dwgTest-AA-dwg1" ref_list="#id29 #id31">
<GSIdentity elemId="id32" label="SxZBFqLyBT4jNA"/>
</PART>
<PART creation_date="2012-09-20T07:21:23Z" date_released="2012-09-20T07:21:27Z" ead_paragraph="" elemId="id438" keep_limit_prop="3" last_mod_date="2012-09-20T07:21:29Z" object_name="dwgTest-AA-dwg2" ref_list="#id46">
<GSIdentity elemId="id21" label="itfBFqLyBT4jNA"/>
</PART>
</TCXML>
答案 1 :(得分:1)
您的输入/输出与您的描述不符:
我想从这个xml中删除那些引用的文件标签 与ref_list标签合作。
以下XSLT执行与该描述相同的操作:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:plm="http://www.tcxml.org/Schemas/TCXMLSchema" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="plm:File">
<xsl:choose>
<xsl:when test="/plm:TCXML/plm:PART[contains(
concat(' ', @ref_list, ' '),
concat(' #', current()/@elemId, ' '))]">
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
第二个模板会丢弃在任何File
元素的elemId
属性中找到ref_list
的所有PART
元素。所有其他File
元素按原样复制。
注意:您的模板无法正常工作,因为translate
期望其第一个参数为字符串;您传递了一个节点列表,该列表已转换为字符串according to the following rule:
通过返回字符串值,将节点集转换为字符串 节点集中的节点,该节点是文档顺序中的第一个节点。如果 node-set为空,返回空字符串。