XSLT:防止相同元素多次出现
我正在尝试使用XSLT处理多个文件。一个文件中的某些内容需要使用另一个文件的内容进行修改 例如,在一个文件中查找元素名“type”,并将其内容替换为名为“targetSiteCode”的元素的内容,依此类推 这是第一个文件(我只展示了尽可能少的工作示例):XSLT:防止相同元素多次出现,xslt,Xslt,我正在尝试使用XSLT处理多个文件。一个文件中的某些内容需要使用另一个文件的内容进行修改 例如,在一个文件中查找元素名“type”,并将其内容替换为名为“targetSiteCode”的元素的内容,依此类推 这是第一个文件(我只展示了尽可能少的工作示例): 为什么需要第二个文件?你似乎没有从中得到任何价值,只有结构。为什么不将其纳入样式表中呢?问题是,有些节点需要从File2复制整个节点,该节点可能“按原样”有多个子节点,但随后只修改整个部分中的一个元素。所以,我不知道。我知道它看起来不漂亮,但
为什么需要第二个文件?你似乎没有从中得到任何价值,只有结构。为什么不将其纳入样式表中呢?问题是,有些节点需要从File2复制整个节点,该节点可能“按原样”有多个子节点,但随后只修改整个部分中的一个元素。所以,我不知道。我知道它看起来不漂亮,但我不知道怎样才能做得更好。理论上,我可以将文件的全部内容(有很多)合并到样式表中,并在必要时进行修改,但这会使样式表太大,并且(依我看)看起来更不美观。此外,将样式表与内容分开也许是好的——需要使用从输入XML中获取的内容填充的结构就是一个模板。依我看,最好将其作为XSLT模板编写并使用。如果愿意,您可以从其他样式表中包含或导入模板。为什么需要第二个文件?你似乎没有从中得到任何价值,只有结构。为什么不将其纳入样式表中呢?问题是,有些节点需要从File2复制整个节点,该节点可能“按原样”有多个子节点,但随后只修改整个部分中的一个元素。所以,我不知道。我知道它看起来不漂亮,但我不知道怎样才能做得更好。理论上,我可以将文件的全部内容(有很多)合并到样式表中,并在必要时进行修改,但这会使样式表太大,并且(依我看)看起来更不美观。此外,将样式表与内容分开也许是好的——需要使用从输入XML中获取的内容填充的结构就是一个模板。依我看,最好将其作为XSLT模板编写并使用。如果愿意,您可以从其他样式表中包括或导入模板。
<?xml version="1.0" encoding="UTF-8"?>
<Document>
<component>
<entryRelationship>
<effectiveTime value="first time"/>
<targetSiteCode code="site" codeSystem="firstcod_esys" codeSystemName="firstcode_name" displayName="firstcode_disp"/>
</entryRelationship>
<entryRelationship>
<effectiveTime value="second time"/>
<targetSiteCode code="LACF"
codeSystem="second_code_sys" codeSystemName="second_code_name" displayName="second_code_disp"/>
</entryRelationship>
</component>
</Document>
<?xml version="1.0" encoding="UTF-8"?>
<Sample>
<receivedTime value="2016-04-04T07:03:00Z"/>
<collect>
<type>
<coding>
<system value="somesystem"/>
<code value="somecode"/>
<display value="somedisplay"/>
</coding>
</type>
</collect>
</Sample>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*" />
<xsl:variable name="input" select="/" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<Bundle>
<entry>
<fullUrl value ="somevalue"/>
<resource>
<xsl:apply-templates select= "Document/component/entryRelationship"/>
</resource>
</entry>
</Bundle>
</xsl:template>
<xsl:template match = "Document/component/entryRelationship">
<xsl:apply-templates select="document('File2.xml')/*"/>
</xsl:template>
<xsl:template match = "Sample/receivedTime">
<receivedTime>
<xsl:apply-templates select = "$input/Document/component/entryRelationship/effectiveTime"/>
</receivedTime>
</xsl:template>
<xsl:template name="effectiveTime">
<time>
<xsl:attribute name="value">
<xsl:value-of select="@displayName" />
</xsl:attribute>
</time>
</xsl:template>
<xsl:template match = "Sample/collect/type">
<type>
<xsl:apply-templates select = "$input/Document/component/entryRelationship/targetSiteCode"/>
</type>
</xsl:template>
<xsl:template match="targetSiteCode">
<coding>
<system >
<xsl:attribute name="value">
<xsl:value-of select="@codeSystem" />
</xsl:attribute>
</system>
<code>
<xsl:attribute name="value">
<xsl:value-of select="@code"/>
</xsl:attribute>
</code>
<display>
<xsl:attribute name="value">
<xsl:value-of select="@displayName" />
</xsl:attribute>
</display>
</coding>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<Bundle>
<entry>
<fullUrl value="somevalue"/>
<resource>
<Sample>
<receivedTime>
<effectiveTime value="first time"/>
<effectiveTime value="second time"/>
</receivedTime>
<collect>
<type>
<coding>
<system value="firstcod_esys"/>
<code value="site"/>
<display value="firstcode_disp"/>
</coding>
<coding>
<system value="second_code_sys"/>
<code value="LACF"/>
<display value="second_code_disp"/>
</coding>
</type>
</collect>
</Sample>
<Sample>
<receivedTime>
<effectiveTime value="first time"/>
<effectiveTime value="second time"/>
</receivedTime>
<collect>
<type>
<coding>
<system value="firstcod_esys"/>
<code value="site"/>
<display value="firstcode_disp"/>
</coding>
<coding>
<system value="second_code_sys"/>
<code value="LACF"/>
<display value="second_code_disp"/>
</coding>
</type>
</collect>
</Sample>
</resource>
</entry>
</Bundle>
<?xml version="1.0" encoding="UTF-8"?>
<Bundle>
<entry>
<fullUrl value="somevalue"/>
<resource>
<Sample>
<receivedTime>
<effectiveTime value="first time"/>
</receivedTime>
<collect>
<type>
<coding>
<system value="firstcod_esys"/>
<code value="site"/>
<display value="firstcode_disp"/>
</coding>
</type>
</collect>
</Sample>
<Sample>
<receivedTime>
<effectiveTime value="second time"/>
</receivedTime>
<collect>
<type>
<coding>
<system value="second_code_sys"/>
<code value="LACF"/>
<display value="second_code_disp"/>
</coding>
</type>
</collect>
</Sample>
</resource>
</entry>
</Bundle>