XML 命名空间正在抛弃我的 XSLT

发布于 2024-11-23 22:12:11 字数 1930 浏览 3 评论 0 原文

我有一个 xml 文档,其名称空间与此类似,我只是为了提出问题而简化了它。

<MyNameSpace xmlns="http://schemas.microsoft.com/dynamics/2006/02/documents/MyNameSpace">
<IDmain>ins</IDmain>
    <Table_1 class="entity">
        <Address>Oak Park Drive</BillingProviderAddress>
        <City>Lake Elizabeth</BillingProviderCity>
        <Name>Corporation</BillingProviderOrgName>
        <InvoiceLine class ="entity">
            <DateService>1234</DateService>
        </InvoiceLine>
    <Table_1>
</MyNameSpace>

然后我在这里创建了一个 XSLT。我理解它的丑陋,我不是 XSLT 专家,但这是“解决问题”的时刻之一。

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">

<xsl:variable name="vPrefix">
<xsl:value-of select="MyNameSpace/Table_1/Address"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="MyNameSpace/Table_1/City"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="MyNameSpace/Table_1/Name"/>
<xsl:text>|</xsl:text>
</xsl:variable>

<xsl:for-each select="MyNameSpace/Table_1/InvoiceLine">
        <xsl:value-of select="$vPrefix"/>
        <xsl:text>|</xsl:text>
        <xsl:value-of select="DateService"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

现在,XSLT 完全按照我的要求执行,问题是,我的测试数据在 XML 文档的顶部包含这个时髦的命名空间。

xmlns="http://schemas.microsoft.com/dynamics/2006/02/documents/MyNameSpace"

有两件事,我正在使用 XMLPAD,当我运行脚本时,它实际上对其中的名称空间处理得很好。

不幸的是,该解决方案并不理想,因为当我尝试在我需要的另一个 XSLT 工具中运行它时,(在运行时)它无法正确运行。

我知道命名空间正在抛弃我正在使用的 XSLT,因为当我从 XML 中删除它时,它在测试中运行良好。然而,这个解决方案并不合理,因为整个过程实际上是自动化的。所以我需要一个解决命名空间问题的方法。

有什么想法吗?

I have an xml document with a name space that looks similar to this, I just simplified it for the sake of asking the question.

<MyNameSpace xmlns="http://schemas.microsoft.com/dynamics/2006/02/documents/MyNameSpace">
<IDmain>ins</IDmain>
    <Table_1 class="entity">
        <Address>Oak Park Drive</BillingProviderAddress>
        <City>Lake Elizabeth</BillingProviderCity>
        <Name>Corporation</BillingProviderOrgName>
        <InvoiceLine class ="entity">
            <DateService>1234</DateService>
        </InvoiceLine>
    <Table_1>
</MyNameSpace>

I then created an XSLT here. I understand its ugly, I'm not an XSLT expert but this was one of those "Just solve the problem" moments.

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">

<xsl:variable name="vPrefix">
<xsl:value-of select="MyNameSpace/Table_1/Address"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="MyNameSpace/Table_1/City"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="MyNameSpace/Table_1/Name"/>
<xsl:text>|</xsl:text>
</xsl:variable>

<xsl:for-each select="MyNameSpace/Table_1/InvoiceLine">
        <xsl:value-of select="$vPrefix"/>
        <xsl:text>|</xsl:text>
        <xsl:value-of select="DateService"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Now, The XSLT does exactly what I want it to, the problem is, my test data include this funky namespace at the top of the XML document.

xmlns="http://schemas.microsoft.com/dynamics/2006/02/documents/MyNameSpace"

Two things, I am using XMLPAD and when I run the script it actually does just fine with the name space in there.

Unfortunately, that solution is not ideal because when I attempt to run it in another XSLT tool that I need, (at run time) it does not run correctly.

I know for a fact the namespace is throwing off the XSLT that I am using, because when I remove it from the XML, it runs fine in testing. However, this solution is not plausible because this entire process is in fact automated. So I need a solution to the namespace issue.

Anythoughts?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦与时光遇 2024-11-30 22:12:11

XPath 是您用来匹配特定元素的 XSLT 的一部分,它是命名空间敏感的。当您有像 MyNameSpace/Table_1/Address 这样的 XPath 时,您将在没有任何 XML 命名空间的情况下匹配元素;即作为任何元素 Table_1 的子元素的任何元素 Address,而该元素是作为当前上下文节点的子元素的任何元素 MyNameSpace 的子元素。

需要添加命名空间前缀;例如:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:z="http://schemas.microsoft.com/dynamics/2006/02/documents/MyNameSpace">

...

<xsl:value-of select="z:MyNameSpace/z:Table_1/z:Address"/>

不幸的是,XSLT 1.0 在评估 XPath 时不考虑当前的默认命名空间,因此您不能只设置默认命名空间并使用它;你确实需要一个命名空间前缀。

如果您可以使用 XSLT 2.0,则可以使用 xpath-default-namespace 属性来设置 XPath 查询中引用的元素的默认命名空间。 (XSLT 2.0 在很多小方面都更加实用,就像这样......)

XPath, which is the part of XSLT you're using to match particular elements, is namespace sensitive. When you have an XPath like MyNameSpace/Table_1/Address you're matching elements without any XML namespace; namely any element Address that's a child of any element Table_1 that's a child of any element MyNameSpace that's a child of the current context node.

You need to add namespace prefixes; e.g.:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:z="http://schemas.microsoft.com/dynamics/2006/02/documents/MyNameSpace">

...

<xsl:value-of select="z:MyNameSpace/z:Table_1/z:Address"/>

Unfortunately, XSLT 1.0 does not consider the current default namespace when evaluating XPaths, so you cannot just set the default namespace and be done with it; you really need a namespace prefix.

If you can use XSLT 2.0, you could use the xpath-default-namespace attribute to set the default namespace for elements referenced in XPath queries. (XSLT 2.0 is quite a bit more practical in a lot of small ways, like this...)

紙鸢 2024-11-30 22:12:11

您可以在 local-name() 上使用元素的通用匹配和谓词过滤器,

例如 *[local-name()='MyNameSpace']/*[local-name() ='Table_1']/*[local-name()='Address']

警告:这是一个更通用的匹配,因此如果您有具有相同命名空间限定元素的文档姓名。

You could use a generic match for elements and a predicate filter on the local-name()

e.g. *[local-name()='MyNameSpace']/*[local-name()='Table_1']/*[local-name()='Address']

WARNING: This is a more generic match, so you could get unpredictable results if you have a document with different namespace qualified elements with the same name.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文