XSLT在输出时保留名称空间
我需要帮助在XSLT转换中保留名称空间。我看到其他线程有解决方案,但我不理解它们。当我使用下面的XSLT转换时,所有名称空间都消失了。下面是我想要实现的目标。非常感谢您的帮助!谢谢大家! 转换XML之前:XSLT在输出时保留名称空间,xslt,xml-namespaces,Xslt,Xml Namespaces,我需要帮助在XSLT转换中保留名称空间。我看到其他线程有解决方案,但我不理解它们。当我使用下面的XSLT转换时,所有名称空间都消失了。下面是我想要实现的目标。非常感谢您的帮助!谢谢大家! 转换XML之前: <?xml version='1.0' encoding='UTF-8'?> <Worker xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:this="this.file/eib" xmlns:is
<?xml version='1.0' encoding='UTF-8'?>
<Worker
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:this="this.file/eib"
xmlns:is="java:com.workday.esb.intsys.xpath.ParsedIntegrationSystemFunctions"
xmlns:tv="java:com.workday.esb.intsys.TypedValue">
<Detail>
<EmployeeID>123456</EmployeeID>
<PayCode>Earning</PayCode>
<Amount>4243.20</Amount>
</Detail>
<Detail>
<EmployeeID>123456</EmployeeID>
<PayCode>Deduction</PayCode>
<Amount>2265.60</Amount>
</Detail>
</Worker>
123456
收入
4243.20
123456
演绎
2265.60
我的XSLT转换:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" exclude-result-prefixes="xsl wd is xsd this env"
xmlns:wd="urn:com.workday/bsvc"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:is="java:com.workday.esb.intsys.xpath.ParsedIntegrationSystemFunctions"
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:this="urn:this-stylesheet">
<xsl:output indent="yes" method="xml"/>
<xsl:template match="/">
<xsl:copy>
<Worker>
<xsl:for-each select="Worker" >
<Detail>
<EmployeeID><xsl:value-of select="Detail[(PayCode ='Earning')]/EmployeeID"/></EmployeeID>
<PayCode><xsl:value-of select="Detail[(PayCode ='Earning')]/PayCode"/></PayCode>
<Amount><xsl:value-of select="Detail[(PayCode ='Earning') and (string-length(Amount) > 0)]/Amount"/></Amount>
</Detail>
</xsl:for-each>
</Worker>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
期望输出:
<?xml version="1.0" encoding="UTF-8"?>
<Worker
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:this="this.file/eib"
xmlns:is="java:com.workday.esb.intsys.xpath.ParsedIntegrationSystemFunctions"
xmlns:tv="java:com.workday.esb.intsys.TypedValue">
<Detail>
<EmployeeID>123456</EmployeeID>
<PayCode>Earning</PayCode>
<Amount>4243.20</Amount>
</Detail>
</Worker>
123456
收入
4243.20
我看不出有什么好理由保留输出中未使用的命名空间声明。但是如果您真的想要它们,为什么不简单地复制它们(作为其父元素的一部分)-例如:
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="*"/>
<xsl:template match="/Worker">
<xsl:copy>
<xsl:copy-of select="Detail[PayCode ='Earning']"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
将其应用于输入示例时,结果将是:
<?xml version="1.0" encoding="UTF-8"?>
<Worker xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:this="this.file/eib"
xmlns:is="java:com.workday.esb.intsys.xpath.ParsedIntegrationSystemFunctions"
xmlns:tv="java:com.workday.esb.intsys.TypedValue">
<Detail>
<EmployeeID>123456</EmployeeID>
<PayCode>Earning</PayCode>
<Amount>4243.20</Amount>
</Detail>
</Worker>
123456
收入
我看不出有什么理由保留输出中未使用的命名空间声明。但是如果您真的想要它们,为什么不简单地复制它们(作为其父元素的一部分)-例如:
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="*"/>
<xsl:template match="/Worker">
<xsl:copy>
<xsl:copy-of select="Detail[PayCode ='Earning']"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
将其应用于输入示例时,结果将是:
<?xml version="1.0" encoding="UTF-8"?>
<Worker xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:this="this.file/eib"
xmlns:is="java:com.workday.esb.intsys.xpath.ParsedIntegrationSystemFunctions"
xmlns:tv="java:com.workday.esb.intsys.TypedValue">
<Detail>
<EmployeeID>123456</EmployeeID>
<PayCode>Earning</PayCode>
<Amount>4243.20</Amount>
</Detail>
</Worker>
123456
收入
至少在XSLT2.0(您使用的版本)中,名称空间会消失,因为您使用了排除结果前缀
属性
只需删除它,XSLT工作表中包含的所有名称空间(除了xsl
)都将按外观顺序显示在输出中
但是,如果您决定省略所有名称空间,那么编写排除结果前缀=“#all”
,而不是再次编写它们就更容易了。至少在XSLT 2.0(您使用的版本)中,名称空间会消失,因为您使用了排除结果前缀
属性
只需删除它,XSLT工作表中包含的所有名称空间(除了xsl
)都将按外观顺序显示在输出中
但是,如果您决定省略所有名称空间,则编写排除结果前缀=“#all”
,而不是再次编写它们更容易。名称空间声明将消失,因为输出中未使用名称空间。为什么需要保留它们(或者认为需要保留它们)?命名空间声明消失了,因为输出中没有使用命名空间。为什么你需要保留它们(或者认为你需要保留它们)?谢谢!这很简单,而且很有效。如您所见,我是初学者。@RemoHernandez注意,这保留了样式表中声明的名称空间,而不是输入XML中声明的名称空间。谢谢!这很简单,而且很有效。如您所见,我是初学者。@RemoHernandez注意,这保留了样式表中声明的名称空间,而不是输入XML中声明的名称空间。谢谢您的帮助!这起作用了。这是用于Workday集成和命名空间,输出是打印excel摘要文件所必需的。感谢您的帮助!这起作用了。这是为了Workday集成和命名空间,输出是打印excel摘要文件所必需的。