【问题标题】:How to validate ids between XML documents in XSD?如何在 XSD 中验证 XML 文档之间的 id?
【发布时间】:2021-03-29 12:41:47
【问题描述】:

我正在尝试为 iOS 和 Android 应用程序制作一个跨平台的字符串管理系统(因此我不必同时翻译这两个应用程序,我可以将字符串从一个应用程序重用到另一个应用程序)。

为此,我使用以下流程:

  1. XML 存储跨平台字符串标识符(可能带有commentiOS-only 等属性)

    <!-- identifiers.xml -->
    <identifiers>
       <id>button_signin_facebook</id>
       <id ios-only="true">button_signin_apple</id>
       ...
    </identifiers>
    
  2. 然后我有 N 种支持的语言的 N 种翻译:

    <!-- translation_en.xml -->
    <translation lang="en">
      <string id="button_signin_facebook">Continue with Facebook</string>
      <string id="button_signin_apple">Continue with Apple ID</string>
      ...
    </translation>
    

一个 PHP 脚本处理所有这些并在验证完整性后为两个平台生成所有翻译文件(查看是否有一些字符串未使用,查看我们是否创建了两次字符串等)

现在我的问题是: 如何为translation_lang.xml 文件创建XSD,强制string 元素的id 属性是identifiers.xml 文件中所有id 的“枚举”(或“引用”?)?(就像数据库中的外键)

我是 XSD 的新手,我发现我可以在 XSD 中进行枚举,但这不是我想要的。 (标识符值需要在 XML 文件 identifiers.xml 中,而不是在模式中,因为它们不是固定的。)

【问题讨论】:

    标签: php xml xsd xsd-validation xml-validation


    【解决方案1】:

    XSD 不能表达单独的 XML 文档之间的约束。

    其他可能性:

    1. 用 XSLT、PHP 或其他语言编写跨文档验证约束。
    2. 将单独的 XML 文档组合成一个复合 XML 文档,以便通过 XSD 进行验证。

    【讨论】:

    • 感谢您的回答。实际上,我在生成平台字符串文件之前使用 PHP 验证了所有这些,但是 XSD 验证对于 IDE 自动完成确实很有帮助。如果我使用解决方案 2,如何在单个文件中表达外键?
    • 一旦标识符和引用位于单个文件中,您可以使用xsd:keyxsd:keyref 来验证此类引用完整性约束。例如,请参阅Allow only other existing XML values in XSD? (xs:key and xs:keyref)
    • 谢谢,我去看看:)
    • 跨文档验证的另一种可能性是使用 XSD 1.1 断言。从技术上讲,模式中使用的 XPath 断言不能使用 doc() 函数引用外部文档,但您可能会发现并非所有处理器都施加此限制。
    猜你喜欢
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 2016-10-19
    • 2014-01-22
    • 2013-05-21
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    相关资源
    最近更新 更多