我有一些用于修改xml文档的xslt文件。 ArcGIS Desktop 10.4的元数据xml。目前我将它们链接在一起以获得所需的输出xml(将xslt 1应用于输入xml,然后将xslt 2应用于第一步的输出,然后应用xslt 3)。虽然这很好但我想将我的三张纸合二为一。我尝试了,但是当我将它们组合起来时,每个部分都会“覆盖”最后一个部分。
这将删除所有不需要的节点。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="no" />
<!-- process the metadata using the templates below -->
<xsl:template match="/">
<xsl:apply-templates select="node() | @*" />
</xsl:template>
<!-- copy all metadata conent -->
<xsl:template match="node() | @*" priority="0">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
<!-- If the element exists, remove it -->
<xsl:template match="resConst | Process | mdContact | citRespParty | idPoC | idCredit | prcStep | rpIndName | rpOrgName | rpPosName | role | displayName | rpCntInfo | searchKeys | themeKeys" />
</xsl:stylesheet>
这增加了一些使用限制。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="no" />
<!-- process the metadata using the templates below -->
<xsl:template match="/">
<xsl:apply-templates select="node() | @*" />
</xsl:template>
<!-- copy all metadata conent -->
<xsl:template match="node() | @*" priority="0">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
<!-- Add Nodes -->
<xsl:template match="dataIdInfo">
<xsl:copy>
<xsl:copy-of select="node() | @*" />
<resConst>
<Consts>
<useLimit>CONFIDENTIAL AND PROPRIETARY INFORMATION</useLimit>
</Consts>
</resConst>
<searchKeys>
<keyword>keyword</keyword>
</searchKeys>
<themeKeys>
<keyword>keyword</keyword>
</themeKeys>
<idCredit>our org</idCredit>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
最后,这个增加了一个联系点。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="no" />
<!-- process the metadata using the templates below -->
<xsl:template match="/">
<xsl:apply-templates select="node() | @*" />
</xsl:template>
<!-- copy all metadata conent -->
<xsl:template match="node() | @*" priority="0">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
<!-- Add Nodes -->
<xsl:template match="idCitation">
<xsl:copy>
<xsl:copy-of select="node() | @*" />
<citRespParty>
<rpIndName>name</rpIndName>
<rpOrgName>org</rpOrgName>
<rpPosName>role</rpPosName>
<role>
<RoleCd value="007" />
</role>
<rpCntInfo>
<cntAddress addressType="">
<delPoint>street number</delPoint>
<city>city</city>
<adminArea>state</adminArea>
<postCode>zip</postCode>
<eMailAdd>email</eMailAdd>
<country>country</country>
</cntAddress>
<cntPhone>
<voiceNum tddtty="">phone number</voiceNum>
</cntPhone>
</rpCntInfo>
</citRespParty>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
示例输入: http://textuploader.com/d92rd
示例输出: http://textuploader.com/d92r6
示例节点更改:您将看到resConsts是节点已完全删除。然后使用我们的组织使用限制文本在同一个XPath中添加一个新的resConsts节点。
这是基于我的流程的Esri网站: http://desktop.arcgis.com/en/arcmap/10.3/manage-data/metadata/editing-metadata-for-many-arcgis-items.htm
答案 0 :(得分:0)
考虑使用XProc
<p:declare-step xmlns:p="http://www.w3.org/ns/xproc"
xmlns:c="http://www.w3.org/ns/xproc-step" version="1.0">
<p:input port="source">
<p:document href="input-file.xml"></p:document>
</p:input>
<p:output port="result"/>
<p:xslt>
<p:input port="stylesheet">
<p:document href="sheet1.xsl"/>
</p:input>
<p:input port="parameters">
<p:empty/>
</p:input>
</p:xslt>
<p:xslt>
<p:input port="stylesheet">
<p:document href="sheet2.xsl"/>
</p:input>
<p:input port="parameters">
<p:empty/>
</p:input>
</p:xslt>
<p:xslt>
<p:input port="stylesheet">
<p:document href="sheet3.xsl"/>
</p:input>
<p:input port="parameters">
<p:empty/>
</p:input>
</p:xslt>
</p:declare-step>
或某些特定于处理器的链接(http://saxonica.com/html/documentation/extensions/output-extras/serialization-parameters.html与saxon:next-in-chain
)。
如果您想手动将三个样式表合并到一个样式表中,请了解如何使用modes并设置它们:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="@* | node()" mode="#all">
<xsl:copy>
<xsl:apply-templates select="@* | node()" mode="#current"/>
</xsl:copy>
</xsl:template>
<xsl:template match="resConst | Process | mdContact | citRespParty | idPoC | idCredit | prcStep | rpIndName | rpOrgName | rpPosName | role | displayName | rpCntInfo | searchKeys | themeKeys"
mode="step1"/>
<xsl:template match="dataIdInfo" mode="step2">
<xsl:copy>
<xsl:copy-of select="node() | @*" />
<resConst>
<Consts>
<useLimit>CONFIDENTIAL AND PROPRIETARY INFORMATION</useLimit>
</Consts>
</resConst>
<searchKeys>
<keyword>keyword</keyword>
</searchKeys>
<themeKeys>
<keyword>keyword</keyword>
</themeKeys>
<idCredit>our org</idCredit>
</xsl:copy>
</xsl:template>
<xsl:variable name="step1">
<xsl:apply-templates mode="step1"/>
</xsl:variable>
<xsl:variable name="step2">
<xsl:apply-templates select="$step1/node()" mode="step2"/>
</xsl:variable>
<xsl:template match="/">
<xsl:apply-templates select="$step2/node()"/>
</xsl:template>
<xsl:template match="idCitation">
<xsl:copy>
<xsl:copy-of select="node() | @*" />
<citRespParty>
<rpIndName>name</rpIndName>
<rpOrgName>org</rpOrgName>
<rpPosName>role</rpPosName>
<role>
<RoleCd value="007" />
</role>
<rpCntInfo>
<cntAddress addressType="">
<delPoint>street number</delPoint>
<city>city</city>
<adminArea>state</adminArea>
<postCode>zip</postCode>
<eMailAdd>email</eMailAdd>
<country>country</country>
</cntAddress>
<cntPhone>
<voiceNum tddtty="">phone number</voiceNum>
</cntPhone>
</rpCntInfo>
</citRespParty>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
键入浏览器并未经测试,但应显示原则。
答案 1 :(得分:0)
我尝试了,但是当我将它们组合起来时,每个部分都会“覆盖”最后一个部分。
如果没有看到输入的示例,我们只能猜测为什么会发生这种情况。我的猜测是你正在使用一些模板来复制节点,而你应该应用其他模板。复制节点会将其直接写入结果树 - 其他模板无法访问。
如果我的猜测是正确的,那么您只需要更改所有出现的内容:
<xsl:copy-of select="node() | @*" />
为:
<xsl:apply-templates select="node() | @*" />
<强> XSLT 强>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- remove selected elements (and their descendants) -->
<xsl:template match="resConst | Process | mdContact | citRespParty | idPoC | idCredit | prcStep | rpIndName | rpOrgName | rpPosName | role | displayName | rpCntInfo | searchKeys | themeKeys" />
<!-- add nodes to dataIdInfo -->
<xsl:template match="dataIdInfo">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
<resConst>
<Consts>
<useLimit>CONFIDENTIAL AND PROPRIETARY INFORMATION</useLimit>
</Consts>
</resConst>
<searchKeys>
<keyword>keyword</keyword>
</searchKeys>
<themeKeys>
<keyword>keyword</keyword>
</themeKeys>
<idCredit>our org</idCredit>
</xsl:copy>
</xsl:template>
<!-- add nodes to idCitation -->
<xsl:template match="idCitation">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
<citRespParty>
<rpIndName>name</rpIndName>
<rpOrgName>org</rpOrgName>
<rpPosName>role</rpPosName>
<role>
<RoleCd value="007" />
</role>
<rpCntInfo>
<cntAddress addressType="">
<delPoint>street number</delPoint>
<city>city</city>
<adminArea>state</adminArea>
<postCode>zip</postCode>
<eMailAdd>email</eMailAdd>
<country>country</country>
</cntAddress>
<cntPhone>
<voiceNum tddtty="">phone number</voiceNum>
</cntPhone>
</rpCntInfo>
</citRespParty>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>