我有一个xml文件,除了需要转换的具有特定值的1个节点外,我需要主要为1复制1。我的XML是这样的:
<?xml version='1.0' encoding='UTF-8'?> <xyz:Workers xmlns:xyz="urn:com.website/xyz"> <xyz:Worker> <xyz:Effective_Change xyz:Sequence="0"> <xyz:Person_Identification xyz:isAdded="1"> <xyz:Identifier> <xyz:ID>MJ 12 34 56 Z</xyz:ID> <xyz:IdType>A Type</xyz:IdType> </xyz:Identifier> </xyz:Person_Identification> </xyz:Effective_Change> </xyz:Worker> <xyz:Worker> <xyz:Effective_Change xyz:Sequence="0"> <xyz:Person_Identification xyz:isUpdated="1"> <xyz:Identifier xyz:isUpdated="1"> <xyz:ID>JHQ123</xyz:ID> <xyz:IdType>B Type</xyz:IdType> </xyz:Identifier> <xyz:Identifier xyz:isUpdated="1"> <xyz:ID xyz:priorValue="555-55-5555">123-45-6789</xyz:ID> <xyz:IdType>C Type</xyz:IdType> </xyz:Identifier> </xyz:Person_Identification> </xyz:Effective_Change> </xyz:Worker> </xyz:Workers>
我需要取节点xyz中加载的值:ID
<xyz:ID>MJ 12 34 56 Z</xyz:ID>
然后去掉空白,看起来像这样:
<xyz:ID>MJ123456Z</xyz:ID>
但是只有当它们的兄弟节点是xyz:IdType = A Type
<xyz:IdType>A Type</xyz:IdType>
这是我尝试的XSLT。我引用了这个堆栈溢出(使用XSLT复制XML中的所有节点,支持特殊情况),但是在处理它之后,我不确定这是否是正确的方法。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:this="urn:this-stylesheet"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xyz="urn:com.website/xyz" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="xs this">
<!--Identity template,
provides default behavior that copies all content into the output -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="xyz:ID">
<xsl:copy>
<xsl:value-of select="translate(node(), ' ', '')"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
这个XSLT给出了以下输出:
<?xml version="1.0" encoding="UTF-8"?><xyz:Workers xmlns:xyz="urn:com.website/xyz">
<xyz:Worker>
<xyz:Effective_Change xyz:Sequence="0">
<xyz:Person_Identification xyz:isAdded="1">
<xyz:Identifier>
<xyz:ID>MJ123456Z</xyz:ID>
<xyz:IdType>A Type</xyz:IdType>
</xyz:Identifier>
</xyz:Person_Identification>
</xyz:Effective_Change>
</xyz:Worker>
<xyz:Worker>
<xyz:Effective_Change xyz:Sequence="0">
<xyz:Person_Identification xyz:isUpdated="1">
<xyz:Identifier xyz:isUpdated="1">
<xyz:ID>JHQ123</xyz:ID>
<xyz:IdType>B Type</xyz:IdType>
</xyz:Identifier>
<xyz:Identifier xyz:isUpdated="1">
<xyz:ID>123-45-6789</xyz:ID>
<xyz:IdType>C Type</xyz:IdType>
</xyz:Identifier>
</xyz:Person_Identification>
</xyz:Effective_Change>
</xyz:Worker>
</xyz:Workers>
接近期望的输出,因为它确实从期望的ID中删除了空白:
<xyz:ID>MJ123456Z</xyz:ID>
但是,在C类型标识符上,它正在删除标签中加载的数据:
之前转换:
<xyz:ID xyz:priorValue="555-55-5555">123-45-6789</xyz:ID>
<xyz:IdType>C Type</xyz:IdType>
转换后:
<xyz:ID>123-45-6789</xyz:ID>
<xyz:IdType>C Type</xyz:IdType>
这是一个问题,因为我希望文件的其余部分是相同的,除了ID的兄弟ID类型= A类型。
我相信这与模板匹配将自身应用于所有ID节点有关。我试着按照这个逻辑做一些事情:
<xsl:template match="xyz:Identifier[xyz:IdType='A Type']">
但是没有运气。任何关于从哪里开始或我应该使用的逻辑类型的线索将非常感谢。
但仅当它们的兄弟节点为xyz:ID_Type = A Type
您可以在xyz:Identifier
上使用谓词。请注意,虽然您说的是xyz:ID_Type
,但示例中有xyz:IdType
。
我也只匹配text()
,所以你不必复制或应用模板到xyz:ID
的属性。
尝试将最后一个模板更改为(如果实际数据需要,将IdType
更改为ID_Type
):
<xsl:template match="xyz:Identifier[xyz:IdType='A Type']/xyz:ID/text()">
<xsl:value-of select="translate(., ' ', '')"/>
</xsl:template>
小提琴:http://xsltfiddle.liberty-development.net/nbUWwbs
请尝试下面的XSLT。
看起来您的XML示例应该有:
<xyz:IdType>A Type</xyz:IdType>
:
<xyz:ID_Type>A Type</xyz:ID_Type>
XSLT><?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xyz="urn:com.website/xyz">
<xsl:output method="xml" indent="yes" encoding="utf-8"
omit-xml-declaration="no"/>
<xsl:strip-space elements="*"/>
<!--Identity Transform pattern-->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="xyz:ID[following-sibling::xyz:ID_Type='A Type']">
<xsl:copy>
<xsl:value-of select="translate(., ' ', '')"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
<?xml version='1.0' encoding='utf-8' ?>
<xyz:Workers xmlns:xyz="urn:com.website/xyz">
<xyz:Worker>
<xyz:Effective_Change xyz:Sequence="0">
<xyz:Person_Identification xyz:isAdded="1">
<xyz:Identifier>
<xyz:ID>MJ123456Z</xyz:ID>
<xyz:ID_Type>A Type</xyz:ID_Type>
</xyz:Identifier>
</xyz:Person_Identification>
</xyz:Effective_Change>
</xyz:Worker>
<xyz:Worker>
<xyz:Effective_Change xyz:Sequence="0">
<xyz:Person_Identification xyz:isUpdated="1">
<xyz:Identifier xyz:isUpdated="1">
<xyz:ID>JHQ123</xyz:ID>
<xyz:ID_Type>B Type</xyz:ID_Type>
</xyz:Identifier>
<xyz:Identifier xyz:isUpdated="1">
<xyz:ID xyz:priorValue="555-55-5555">123-45-6789</xyz:ID>
<xyz:ID_Type>C Type</xyz:ID_Type>
</xyz:Identifier>
</xyz:Person_Identification>
</xyz:Effective_Change>
</xyz:Worker>
</xyz:Workers>