Xml XSLT命名空间防止在输出中更改标识转换
我正在对一些EAD编码的存档描述XML文档执行XSLT2.0标识转换。我需要稍微修改输出,但似乎遇到了名称空间问题 不要在支持模式的处理器中测试此项,否则会出现错误!: XSLT: Sample-EAD.xml也可在pastebin上找到: 如果我从元素中提取名称空间信息,这里也可以使用:带有修改的标识转换可以工作 样本-EAD-2:Xml XSLT命名空间防止在输出中更改标识转换,xml,xslt,xslt-2.0,Xml,Xslt,Xslt 2.0,我正在对一些EAD编码的存档描述XML文档执行XSLT2.0标识转换。我需要稍微修改输出,但似乎遇到了名称空间问题 不要在支持模式的处理器中测试此项,否则会出现错误!: XSLT: Sample-EAD.xml也可在pastebin上找到: 如果我从元素中提取名称空间信息,这里也可以使用:带有修改的标识转换可以工作 样本-EAD-2: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ead> <ea
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ead>
<eadheader findaidstatus="Ready_for_online" repositoryencoding="iso15511" countryencoding="iso3166-1" dateencoding="iso8601" langencoding="iso639-2b">
<eadid>01234</eadid>
<filedesc>
<AAA>1</AAA>
<BBB>2</BBB>
</filedesc>
</eadheader>
<archdesc>
<bib>
<CCC>1</CCC>
<DDD>2</DDD>
</bib>
</archdesc>
我不太擅长使用名称空间,因此任何建议都将不胜感激。如果我尝试将名称空间添加到XSLT中,转换会起作用,但我会在新元素中获得名称空间属性。非常感谢您的阅读和建议!
干杯
编辑:
输入w/名称空间,运行标识转换结果-
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ead xmlns:ns2="http://www.w3.org/1999/xlink" xmlns="urn:isbn:1-931666-22-9"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:isbn:1-931666-22-9 http://www.loc.gov/ead/ead.xsd">
<eadheader findaidstatus="Ready_for_online" repositoryencoding="iso15511"
countryencoding="iso3166-1"
dateencoding="iso8601"
langencoding="iso639-2b">
<eadid>01234</eadid>
<filedesc>
<AAA>1</AAA>
<BBB>2</BBB>
</filedesc>
</eadheader>
<archdesc>
<bib>
<CCC>1</CCC>
<DDD>2</DDD>
</bib>
</archdesc>
</ead>
不带名称空间的输入通过标识转换结果运行-
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ead>
<eadheader findaidstatus="Ready_for_online" repositoryencoding="iso15511"
countryencoding="iso3166-1"
dateencoding="iso8601"
langencoding="iso639-2b">
<eadid>01234</eadid>
<filedesc>
<header>Subjects</header>
<AAA>1</AAA>
<BBB>2</BBB>
</filedesc>
</eadheader>
<archdesc>
<bib>
<CCC>1</CCC>
<DDD>2</DDD>
</bib>
</archdesc>
最后,输入w/名称空间通过XSLT运行,并添加名称空间结果-
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ead>
<eadheader findaidstatus="Ready_for_online" repositoryencoding="iso15511"
countryencoding="iso3166-1"
dateencoding="iso8601"
langencoding="iso639-2b">
<eadid>01234</eadid>
<filedesc>
<header>Subjects</header>
<AAA>1</AAA>
<BBB>2</BBB>
</filedesc>
</eadheader>
<archdesc>
<bib>
<CCC>1</CCC>
<DDD>2</DDD>
</bib>
</archdesc>
XSLT:
结果:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ead xmlns:ns2="http://www.w3.org/1999/xlink" xmlns="urn:isbn:1-931666-22-9"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:isbn:1-931666-22-9 http://www.loc.gov/ead/ead.xsd">
<eadheader findaidstatus="Ready_for_online" repositoryencoding="iso15511"
countryencoding="iso3166-1"
dateencoding="iso8601"
langencoding="iso639-2b">
<eadid>01234</eadid>
<filedesc>
<AAA>1</AAA>
<BBB>2</BBB>
</filedesc>
</eadheader>
<archdesc>
<bib>
<CCC>1</CCC>
<DDD>2</DDD>
</bib>
</archdesc>
</ead>
编辑2:
抱歉,我想我没有表达出我想要的结果。我希望在修改的元素中避免附加属性,因为附加处理将在标识转换之后进行,并且我希望使XML尽可能接近它的当前状态(编辑除外)。再次感谢您的耐心和帮助!以下是一个例子:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ead xsi:schemaLocation="urn:isbn:1-931666-22-9 http://www.loc.gov/ead/ead.xsd" xmlns:ns2="http://www.w3.org/1999/xlink" xmlns="urn:isbn:1-931666-22-9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<eadheader findaidstatus="Ready_for_online" repositoryencoding="iso15511" countryencoding="iso3166-1" dateencoding="iso8601" langencoding="iso639-2b">
<eadid>01234</eadid>
<filedesc>
<header>List Name</header>
<AAA>1</AAA>
<BBB>2</BBB>
</filedesc>
</eadheader>
<archdesc>
<bib>
<CCC>1</CCC>
<DDD>2</DDD>
</bib>
</archdesc>
</ead>
这是一个很长的问题,有点难以理解,但我认为这正是你想要的。问题是,要匹配的元素位于源xml文档的名称空间中,因此也必须匹配名称空间。因此,我在xslt:xmlns:input=urn:isbn:1-931666-22-9中为它分配了一个前缀,然后我使用它来匹配filedesc元素:。我还将同一名称空间设置为xsl的默认名称空间,以便您的元素位于该名称空间中
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:input="urn:isbn:1-931666-22-9"
xmlns="urn:isbn:1-931666-22-9"
exclude-result-prefixes="input"
version="2.0">
<xsl:output method="xml" indent="yes" standalone="no"/>
<!-- The identity transform -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="input:filedesc">
<xsl:copy>
<header>Subjects</header>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
你能发布你得到的输出并指出你对哪些属性有疑问吗?嗨,科林D,我已经添加了更多的例子。请让我知道,如果我可以提供更多的信息!谢谢我认为排除结果prefixes=all是问题所在,只列出您真正想要排除的前缀。嗨,biziclop,谢谢您的建议,但这似乎没有帮助。将元素添加到仍然不起作用。所以您关心的属性是xmlns:*属性?您希望将其从输出中排除的原因是什么?嗨,大卫-谢谢您的回复。我通过另一个帮助论坛得到了类似的回答。我真的很感谢你的帮助!干杯
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ead xsi:schemaLocation="urn:isbn:1-931666-22-9 http://www.loc.gov/ead/ead.xsd" xmlns:ns2="http://www.w3.org/1999/xlink" xmlns="urn:isbn:1-931666-22-9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<eadheader findaidstatus="Ready_for_online" repositoryencoding="iso15511" countryencoding="iso3166-1" dateencoding="iso8601" langencoding="iso639-2b">
<eadid>01234</eadid>
<filedesc>
<header>List Name</header>
<AAA>1</AAA>
<BBB>2</BBB>
</filedesc>
</eadheader>
<archdesc>
<bib>
<CCC>1</CCC>
<DDD>2</DDD>
</bib>
</archdesc>
</ead>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:input="urn:isbn:1-931666-22-9"
xmlns="urn:isbn:1-931666-22-9"
exclude-result-prefixes="input"
version="2.0">
<xsl:output method="xml" indent="yes" standalone="no"/>
<!-- The identity transform -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="input:filedesc">
<xsl:copy>
<header>Subjects</header>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>