XPath (v1) contains no way to encode expressions.
If you only have single OR double quotes then you can use expressions such as
//review[@name="Bob's Pizza"]
//review[@name='"Pizza" Pam']
But if you have BOTH e.g [Fred's "Fancy Pizza"] then you have to use something like this Escaping Strings in XPath (C++) to generate
//review[@name=Concat("Fred's ",'"Fancy Pizza"')]
Anyone have a function in c# to do this?
Some links that are close
- Use the MVP.XML library and XPathVariable (a very good solution but a bit heavyweight for my needs).
- Doesn't encode where both " and ' are present
- Adds more arguments to the Concat operation than is necessary e.g. would return //review[@name=concat('Fred', "'", 's ', '"', 'Fancy Pizza', '"', '')]
EDIT: A few answers have suggested escaping ' with '
and " with "
but although this makes sense it does not work; try it using the XML fragment:
<review name="Bob's Pizza"/>
and the xpath
//review[@name='Bob's Pizza']
I needed to do this in XSLT itself, so came up with the following based on the answers on this page:
Join in the fun
This is what I've come up with
Called using something like
So we get the following results
So it's only using concat when its necessary (both " and ' in string)
The last result show the concat operation is not as short as it could be (see question) but its close enough and anything more optimal would be very complex as you would have to look for matching pairs of " or '.
I've had problems with all solutions so far. One has extra text sections (e.g. '"' or "'") which breaks what you're looking for. One drops all text after the last quote/dblquote which breaks as well.
This is a dumb and quick solution from a dumb vb developer:
Usage (same as previous examples):
I was in need of this so I created this solution, for C#.
Another variation...my concat() part is a little lazy, but at least it uses the whole value.