gpt4 book ai didi

xml - 如何使用命名空间对 XML 进行 XSL 转换?

转载 作者:行者123 更新时间:2023-12-04 16:59:12 24 4
gpt4 key购买 nike

我有一个带有命名空间的 XML,我需要转换它。
这是我的 XML:


<HouseOfWindsorFamily
xmlns="http://www.myexample.com">

<person id="1.1">
<title>Queen Elizabeth II</title>
<familyName>Windsor</familyName>
<name>Elizabeth Alexandra Mary</name>
<dob>1926-04-21</dob>
<parents>
<father>King George IV</father>
<mother>Elizabeth Bowes-Lyon</mother>
</parents>
<siblings>
<sibling>1.3</sibling>
</siblings>
<spouse>
<current>1.2</current>
</spouse>
<children>
<child number="01">2.1</child>
<child number="02">2.2</child>
<child number="03">2.3</child>
<child number="04">2.4</child>
</children>
</person>
<person id="1.2">
<title>Prince Philip, Duke of Edinburgh</title>
<familyName>Mountbatten</familyName>
<name>Philip</name>
<dob>1921-06-10</dob>
<parents>
<father>Prince Andrew of Greece and Denmark</father>
<mother>Princess Alice of Battenberg</mother>
</parents>
<spouse>
<current>1.1</current>
</spouse>
</person>
<person id="1.3">
<title>Princess Margaret, Countess of Snowdon</title>
<familyName>Windsor</familyName>
<name>Margaret Rose</name>
<dob>1930-08-21</dob>
<parents>
<father>King George IV</father>
<mother>Elizabeth Bowes-Lyon</mother>
</parents>
<siblings>
<sibling>1.1</sibling>
</siblings>
</person>
<person id="2.1">
<title>Prince Charles, Prince of Wales</title>
<familyName>Mountbatten-Windsor</familyName>
<name>Charles Philip Arthur George</name>
<dob>1948-11-14</dob>
<parents>
<father>1.2</father>
<mother>1.1</mother>
</parents>
</person>
<person id="2.2">
<title>Princess Anne, Princess Royal</title>
<familyName>Mountbatten-Windsor</familyName>
<name>Anne Elizabeth Alice Louise</name>
<dob>1950-08-15</dob>
<parents>
<father>1.2</father>
<mother>1.1</mother>
</parents>
</person>
<person id="2.3">
<title>Prince Andrew, Duke of York</title>
<familyName>Mountbatten-Windsor</familyName>
<name>Andrew Albert Christian Edward</name>
<dob>1960-02-19</dob>
<parents>
<father>1.2</father>
<mother>1.1</mother>
</parents>
</person>
<person id="2.4">
<title>Prince Edward, Earl of Wessex</title>
<familyName>Mountbatten-Windsor</familyName>
<name>Edward Antony Richard Louis</name>
<dob>1964-03-10</dob>
<parents>
<father>1.2</father>
<mother>1.1</mother>
</parents>
</person>
</HouseOfWindsorFamily>

这是我的 XSLT:
 <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/*">
<xsl:for-each select="/*/*">
<xsl:if test="@id = '1.1'">
<xsl:copy>
<xsl:apply-templates select="* | @*"/>
</xsl:copy>
</xsl:if>
</xsl:for-each>
</xsl:template>

<xsl:template match="* | @*">
<xsl:copy>
<xsl:choose>
<xsl:when test="string-length(.) &lt; 5 and contains(text(), '.')">
<xsl:variable name="newid" select="text()"/>
<xsl:value-of select="../../../*[@id = $newid]/title"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates/>
</xsl:otherwise>
</xsl:choose>
</xsl:copy>
</xsl:template>

</xsl:stylesheet>

当我的 XML 没有任何命名空间时,此 XSLT 工作正常。但是当我添加命名空间时它不能正常工作 - 没有显示我需要的数据。

我应该怎么做才能让它工作?我应该向 XSLT 添加 namespace 吗?如果是,那么如何?带有这样的前缀:
<xmlns:ns1="http://www.myexample.com"> 

或者没有它像这样
<xmlns="http://www.myexample.com">

如果我添加带有前缀的命名空间,我是否应该为 XSLT 中的所有元素添加前缀?
我试图通过添加命名空间来解决我的问题,但无法使其正常工作。

也许有人会帮我解决这个问题?
非常感谢您提前!

最佳答案

我能看到您按名称引用元素的唯一地方是这里(准确地说是 title 元素):

<xsl:value-of select="../../../*[@id = $newid]/title"/>

具有您发布的 XML 输入中的默认命名空间, title元素继承该命名空间。要匹配命名空间中的元素,您需要声明一个指向命名空间 uri 的前缀,例如:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns1="http://www.myexample.com">

然后像这样使用该前缀:
<xsl:value-of select="../../../*[@id = $newid]/ns1:title"/>

Xsltransform Demo

关于xml - 如何使用命名空间对 XML 进行 XSL 转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32064067/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com