如何批量设置 XML 属性(该区域已设置)?
How do I bulk set XML attributes (that area already set)?
我有一个 xml 文件,root.xml:
<root>
<procedure
topic-file="Procedure1"
status="Undefined">
<title> Procedure Number 1 </title>
</procedure>
<procedure
topic-file="Procedure2"
status="Undefined">
<title> Procedure Number 2 </title>
</procedure>
<procedure
topic-file="Procedure3"
status="Undefined">
<title> Procedure Number 3 </title>
</procedure>
<procedure
topic-file="Procedure4"
status="Undefined">
<title> Procedure Number 4 </title>
</procedure>
</root>
请注意,我正在跟踪 4 个程序。我想一次更改 2 个程序的状态。我要更改的内容已在 XML 文件中注明,statusByTitle.xml
<?xml version="1.0" encoding="UTF-8"?>
<statuses>
<status topic-file="Procedure1">Complete</status>
<status topic-file="Procedure3">Draft</status>
</statuses>
我想一次性更改过程 1 和 3 的状态,因此我创建了这个 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="*"/>
<!-- set up the key -->
<xsl:key name="statusByTitle" match="status" use="/topic-file" />
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- use the key to set the attribute of the correct procedure -->
<xsl:template
match="item[key('statusByTitle', status, document('statusByTitle.xml'))]/@status">
<xsl:attribute name="status">
<xsl:value-of select="key('statusByTitle', ../status, document('statusByTitle.xml'))" />
</xsl:attribute>
</xsl:template>
I 运行 使用 Saxon-HE 9.5.1.7 在 Oxygen 中进行此转换,输出文件与输入文件相同。我盯着这个看了一会儿,找不到错误。我是否误解了密钥?
<xsl:key name="statusByTitle" match="status" use="/topic-file" />
应该 <xsl:key name="statusByTitle" match="status" use="@topic-file" />
。然后你有错误的元素名称 item
而不是 procedure
:
<xsl:template
match="procedure[key('statusByTitle', @topic-file, document('statusByTitle.xml'))]/@status">
<xsl:attribute name="status" select="key('statusByTitle', ../@topic-file, document('statusByTitle.xml'))" />
</xsl:template>
所有更正我最终得到
<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="*"/>
<xsl:param name="status-url" select="'test2015080705.xml'"/>
<xsl:param name="status-doc" select="doc($status-url)"/>
<!-- set up the key -->
<xsl:key name="statusByTitle" match="status" use="@topic-file" />
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- use the key to set the attribute of the correct procedure -->
<xsl:template
match="procedure[key('statusByTitle', @topic-file, $status-doc)]/@status">
<xsl:attribute name="status" select="key('statusByTitle', ../@topic-file, $status-doc)" />
</xsl:template>
</xsl:stylesheet>
我有一个 xml 文件,root.xml:
<root>
<procedure
topic-file="Procedure1"
status="Undefined">
<title> Procedure Number 1 </title>
</procedure>
<procedure
topic-file="Procedure2"
status="Undefined">
<title> Procedure Number 2 </title>
</procedure>
<procedure
topic-file="Procedure3"
status="Undefined">
<title> Procedure Number 3 </title>
</procedure>
<procedure
topic-file="Procedure4"
status="Undefined">
<title> Procedure Number 4 </title>
</procedure>
</root>
请注意,我正在跟踪 4 个程序。我想一次更改 2 个程序的状态。我要更改的内容已在 XML 文件中注明,statusByTitle.xml
<?xml version="1.0" encoding="UTF-8"?>
<statuses>
<status topic-file="Procedure1">Complete</status>
<status topic-file="Procedure3">Draft</status>
</statuses>
我想一次性更改过程 1 和 3 的状态,因此我创建了这个 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="*"/>
<!-- set up the key -->
<xsl:key name="statusByTitle" match="status" use="/topic-file" />
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- use the key to set the attribute of the correct procedure -->
<xsl:template
match="item[key('statusByTitle', status, document('statusByTitle.xml'))]/@status">
<xsl:attribute name="status">
<xsl:value-of select="key('statusByTitle', ../status, document('statusByTitle.xml'))" />
</xsl:attribute>
</xsl:template>
I 运行 使用 Saxon-HE 9.5.1.7 在 Oxygen 中进行此转换,输出文件与输入文件相同。我盯着这个看了一会儿,找不到错误。我是否误解了密钥?
<xsl:key name="statusByTitle" match="status" use="/topic-file" />
应该 <xsl:key name="statusByTitle" match="status" use="@topic-file" />
。然后你有错误的元素名称 item
而不是 procedure
:
<xsl:template
match="procedure[key('statusByTitle', @topic-file, document('statusByTitle.xml'))]/@status">
<xsl:attribute name="status" select="key('statusByTitle', ../@topic-file, document('statusByTitle.xml'))" />
</xsl:template>
所有更正我最终得到
<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="*"/>
<xsl:param name="status-url" select="'test2015080705.xml'"/>
<xsl:param name="status-doc" select="doc($status-url)"/>
<!-- set up the key -->
<xsl:key name="statusByTitle" match="status" use="@topic-file" />
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- use the key to set the attribute of the correct procedure -->
<xsl:template
match="procedure[key('statusByTitle', @topic-file, $status-doc)]/@status">
<xsl:attribute name="status" select="key('statusByTitle', ../@topic-file, $status-doc)" />
</xsl:template>
</xsl:stylesheet>