使用XSLT复制XML中的所有节点,同时用特定的兄弟值转换节点



我有一个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>

最新更新