【问题标题】:Line breaks (\n) via concat() in XPath?通过 XPath 中的 concat() 换行 (\n)?
【发布时间】:2016-03-30 15:06:21
【问题描述】:

所以我的系统中有一个员工的 XML 文档:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<couriersystem title="System"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="schema.xsd">
    <!-- snip -->
    <employees>
        <employee eid="1">
            <nin>AZ123518D</nin>
            <firstname>Peter</firstname>
            <lastname>Smith</lastname>
            <gender>Male</gender>
            <dob>1994-02-11</dob>
            <email>ps11@gmail.com</email>
            <address>
                119, London Street, Nidrie, F57 8NE
            </address>
            <tel>07005748900</tel>
            <salary>30526</salary>
            <empbranch bid="1" />
            <supervisor sid="1" />
        </employee>
        <employee eid="2">
            <nin>CN174869F</nin>
            <firstname>Jennifer</firstname>
            <lastname>Black</lastname>
            <gender>Male</gender>
            <dob>1984-12-24</dob>
            <email>jb21@gmail.com</email>
            <address>
                161, South Road, Nidrie, W79 8WG
            </address>
            <tel>07555111222</tel>
            <salary>40576</salary>
            <empbranch bid="2" />
            <supervisor sid="1" />
        </employee>
        <employee eid="3">
            <nin>ET127654M</nin>
            <firstname>Aaron</firstname>
            <lastname>Jones</lastname>
            <gender>Male</gender>
            <dob>1968-03-15</dob>
            <email>aj31@gmail.com</email>
            <address>
                66, High Road, Yoker, Q47 4SR
            </address>
            <tel>07856471267</tel>
            <salary>30526</salary>
            <empbranch bid="3" />
            <supervisor sid="1" />
        </employee>
        <employee eid="4">
            <nin>GC765238A</nin>
            <firstname>Alistair</firstname>
            <lastname>Smith</lastname>
            <gender>Male</gender>
            <dob>1976-11-26</dob>
            <email>as11@gmail.com</email>
            <address>
                109, West Plaza, Clydebank, G55 8RC
            </address>
            <tel>07000123123</tel>
            <salary>25400</salary>
            <empbranch bid="4" />
            <supervisor sid="1" />
        </employee>
        <employee eid="5">
            <nin>HP146854D</nin>
            <firstname>Emma</firstname>
            <lastname>Reynolds</lastname>
            <gender>Male</gender>
            <dob>1995-05-05</dob>
            <email>er11@yahoo.com</email>
            <address>
                57, Scott Street, Aberdeen, O75 2KS
            </address>
            <tel>07625361536</tel>
            <salary>25400</salary>
            <empbranch bid="5" />
            <supervisor sid="7" />
        </employee>
        <!-- snip -->
    </employees>
    <!-- snip -->
</couriersystem>

我有以下 XPath 可以由他们的主管检索所有员工的详细信息:

//employee[supervisor/@sid='1']/concat('Name: ', concat(firstname/text(), ' ', lastname/text(), '\nGender: ', gender/text(), '\nD.O.B: ', dob/text()))

但它只显示其余员工中的一名员工,\n 字符也会显示。

我该如何解决这个问题?

【问题讨论】:

    标签: xml xpath newline


    【解决方案1】:

    要在 XPath 中将 \n 解释为 concat(),请使用 codepoints-to-string(10) [credit: @madcrazydrumma]:

    //employee[supervisor/@sid='1']/concat('Name: ', firstname, ' ', lastname, 
                                           codepoints-to-string(10),
                                           'Gender: ', gender, 
                                           codepoints-to-string(10),
                                           'D.O.B: ', dob)
    

    然后返回结果如下:

    Name: Peter Smith
    Gender: Male
    D.O.B: 1994-02-11
    Name: Jennifer Black
    Gender: Male
    D.O.B: 1984-12-24
    Name: Aaron Jones
    Gender: Male
    D.O.B: 1968-03-15
    Name: Alistair Smith
    Gender: Male
    D.O.B: 1976-11-26
    

    小提示:您的基本 XPath 2.0 表达式结果很好。正如我们在 cmets 中发现的那样,由于站点 xpathtester.com/xpath 的限制,结果不正确。使用 videlibri.sourceforge.net/cgi-bin/xidelcgi 代替在线 XPath 2.0 测试。

    【讨论】:

    • 它只返回一个结果,这是最奇怪的!
    • 您使用的是什么 XPath 2.0 库?
    • 我已经看到该站点的 XPath 2.0 实现存在此类问题。试试这个网站:videlibri.sourceforge.net/cgi-bin/xidelcgi
    • @kjhuges 解决了这个问题!但是我怎样才能使用新行呢?
    • 我四处寻找如何检测包含换行符的 XML 元素,这是我见过的第一次提到 codepoints-to-string();谢谢你!我所有指定 '\n' 或 '\r' 的尝试都不起作用。但这在 Altova XMLSpy 中非常适合我:/PNRList/PNR/SegmentList/HotelSegment/Address[contains(text(), codepoints-to-string(10))]
    【解决方案2】:

    好吧,我用 XSLT 测试了你的 XPath 表达式,输出包含你想要的 4 个条目:

    我的 XSLT 是:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:template match="/couriersystem">
        <xsl:copy-of select="//employee[supervisor/@sid='1']/concat('Name: ', concat(firstname/text(), ' ', lastname/text(), '\nGender: ', gender/text(), '\nD.O.B: ', dob/text()))" />
      </xsl:template>
    </xsl:stylesheet>
    

    结果都在一行文本中:

    <?xml version="1.0" encoding="UTF-8"?>Name: Peter Smith\nGender: Male\nD.O.B: 1994-02-11 Name: Jennifer Black\nGender: Male\nD.O.B: 1984-12-24 Name: Aaron Jones\nGender: Male\nD.O.B: 1968-03-15 Name: Alistair Smith\nGender: Male\nD.O.B: 1976-11-26
    

    如果你想让输出的格式比上面的多一点,试试这个在适当的地方插入space字符的表达式:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:template match="/couriersystem">
        <xsl:value-of select="'&#10;'" />
        <xsl:for-each select="//employee[supervisor/@sid='1']">
          <xsl:value-of select="concat('Name: ', firstname/text(), ' ', lastname/text(), '&#10;','Gender: ', gender/text(), '&#10;','D.O.B: ', dob/text(),'&#10;')" />
        </xsl:for-each>
      </xsl:template>
    </xsl:stylesheet>
    

    这样的结果是:

    <?xml version="1.0" encoding="UTF-8"?>
    Name: Peter Smith
    Gender: Male
    D.O.B: 1994-02-11
    Name: Jennifer Black
    Gender: Male
    D.O.B: 1984-12-24
    Name: Aaron Jones
    Gender: Male
    D.O.B: 1968-03-15
    Name: Alistair Smith
    Gender: Male
    D.O.B: 1976-11-26
    

    P.S.:“詹妮弗·布莱克”是变性人吗?因为她有一个女性名字和一个男性性别;-)

    【讨论】:

    • 哈哈我的朋友输入数据所以也许吧! ;) 而且我没有为此使用 XSL,所以很遗憾不能解决问题
    • 好吧,我最后的话只是一个小玩笑g。但是,我的 XPath 表达式与接受的答案基本相同,只需将 &amp;#10; 替换为 codepoints-to-string(10) 并将表达式合并即可。
    猜你喜欢
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    相关资源
    最近更新 更多